2011-11-08 100 views
0

我在保持MySQL查询直线时非常糟糕,但除此之外,我有一个查询可用于某些数据输入,但不是全部。我的猜测是引号在应该出现的位置被转义。转义MySQL查询问题

我有整个查询字符串在同一时间被转义。这是不好的做法还是它真的很重要?

这里的查询:

"INSERT INTO bio_manager_pubs(userid,category,citation,date,link,requests) VALUES (".  
$userid.",'". 
$_POST['category']."', '". 
htmlentities($_POST['pub'])."', 
FROM_UNIXTIME(".strtotime($_POST['date'])."),'". 
$_POST['link']."', 
0)" 

查询:

  • 用户名和请求是整数
  • 链接和类别的小文本(不知道这是适当的,但最多为255字符,那么VarChar会更好?)
  • 日期是一个日期(是否更好重新格式化与PHP或重新格式化与MySQL?)
  • 引用是文本字段

任何想法?

感谢

编辑: 回答这个问题被张贴四次有abouts其中,问题是我逃避整个查询。

什么是遗漏的,并造成一些混淆的代码围绕查询。 正是这样

$db->query($query) 

这其中函数查询是:

public function query($SQL) 
{ 
    $this->SQL = $this->mysqli->real_escape_string($SQL); 
    $this->result = $this->mysqli->query($SQL); 

    if ($this->result == true) 
    { 
     return true; 
    } 
    else 
    { 
     printf("<b>Problem with SQL:</b> %s\n", $this->SQL); 
     exit; 
    } 
} 

我只是发现了一类使人生小项目简单,坚持了下来一点。现在,我遇到的问题是删除$this->mysqli->real_escape_string($SQL);并在代码中的其他地方添加转义。

+0

你可以给出具体的案例,它的工作原理和失败的地方?我看到你用mysql-real-escape-string标记了你的问题,但是根本没有看到你使用它,它可能只是你的问题的答案。 – lanzz

+0

您是否尝试过'echo'或'var_dump'这个字符串,看看它是什么样子?请花点时间熟悉这一点:http://en.wikipedia.org/wiki/SQL_injection – Quasdunk

+0

建议使用mysql_error()记录失败的查询,并尝试插入数据并从中找出原因模式和错误消息.... – optimusprime619

回答

1

我真的没有看到任何对$ _POST数据进行消毒,并且在插入数据库之前确实没有必要运行htmlentities,当您将该数据显示在页面上时应该这样做。确保清理您的帖子!使用mysql_real_escape_string()或最好使用PDO和预准备语句。

如果您在整个查询中运行mysql_real_escape_string(),那么在构建它之后,就会发生这种情况。

在单个帖子上使用它,和/或转换应该只能是整数数字的变量。

继承人什么,我会在你的情况下,将其更改为:

$posted = $_POST; 

foreach($posted as &$value) 
    $value = mysql_real_escape_string($value); 

$date = strtotime($posted['date']); 


$q = "INSERT INTO bio_manager_pubs(userid,category,citation,date,link,requests) VALUES 
(
'{$userid}', 
'{$posted['category']}', 
'{$posted['pub'])}', 
FROM_UNIXTIME({$posted['date']}), 
'{$posted['link']}', 
'0' 
)"; 
0

我认为你需要用你的每一个投入在mysql_real_escape_string,而不是整个查询(只有一次!)。除此之外,它看起来对我很好。

"INSERT INTO bio_manager_pubs(userid,category,citation,date,link,requests) VALUES (".  
mysql_real_escape_string($userid).",'". 
mysql_real_escape_string($_POST['category'])."', '". 
mysql_real_escape_string(htmlentities($_POST['pub']))."', 
FROM_UNIXTIME(".mysql_real_escape_string(strtotime($_POST['date']))."),'". 
mysql_real_escape_string($_POST['link'])."', 
0)" 
1

我认为构建整个查询然后逃避整个事情被认为是不好的做法。输入代码后应立即清理输入,而不是在开始使用它们来建立数据库交互之后。

你想要消毒每个输入,有点像这样:

$category = mysql_real_escape_string($_POST['category']) 

然后你会使用局部变量,而不是投入,建立自己的SQL指令(S)。

此外,您可能希望查看诸如PDO之类的数据访问,它为您管理了许多详细信息。

+0

感谢您的PDO链接,我从未真正听说过他们。我目前使用的类似乎是在试图做这样的事情(但不是很完整)。 –

0

而是逃离整个SQL查询(可以运行摔东西的风险),只是逃避用户的输入:

$userid = mysql_real_escape_string($userid); 
$cat = mysql_real_escape_string($_POST['category']); 
$pub = mysql_real_escape_string($_POST['pub']); 
$date = strtotime($_POST['date']); 
$link = mysql_real_escape_string($_POST['link']); 
$query = "INSERT INTO bio_manager_pubs(userid, category, citation, date, link, requests)" 
          ." VALUES ($userid, '$cat', '$pub',  $date, '$link', 0  );"; 
0

那么一开始你应该避免直接在使用外部数据源的数据查询,所以我会重写代码,以免在查询中使用$ _POST。更好的是,如果你可以使用PDO或类似的来逃避你的数据。在将数据插入数据库之前,我会避免使用htmlentities来转换文本。将数据从数据库中提取出来之后,您最好做到这一点,因为您可以在其他(非HTML)输出上下文中使用该数据。

但是就内联代码而言,你有magic_quotes吗?

尝试是这样的

if (get_magic_quotes_gpc()) { 
    $category = stripslashes($_POST['category']); 
    $pub = stripslashes($_POST['pub']); 
    $link = stripslashes($_POST['link']); 
} else { 
    $category = $_POST['category']; 
    $category = $_POST['category']; 
    $category = $_POST['category']; 
} 
$category = mysql_escape_string($category); 
$pub = mysql_escape_string($pub); 
$link = mysql_escape_string($link); 
$sql = " 
    INSERT INTO bio_manager_pubs(userid,category,citation,date,link,requests) VALUES (  
    ". $userid.", 
    '$category', 
    '$pub', 
    FROM_UNIXTIME(".strtotime($_POST['date'])."), 
    '$link', 
    0 
)"; 
0

关闭magic_quotes_gpc的,用准备好的语句。

如果禁用了magic_quotes_gpc,那么最终不会自动转义输入 - 而magic_quotes_gpc也不推荐使用。

使用参数绑定准备语句来避免SQL注入而不是转义字符。我个人建议使用PDO或MDB2与您的数据库交谈,但您也可以使用mysqli驱动程序执行准备好的语句。请注意,mysql驱动程序也位于砧板上,因此您不久将被迫使用mysqli或MDB2等抽象层。

我敢打赌,magic_quotes_gpc是你的问题。