0

我在保持 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)"

在查询中:

  • Userid 和 requests 是整数
  • 链接和类别是小文本(不确定这是否合适,但最大为 255 个字符,那么 VarChar 会更好吗?)
  • 日期是日期(用php重新格式化还是用mysql重新格式化更好?)
  • 引文是一个文本字段

有任何想法吗?

谢谢

编辑: 这个问题的答案在那里发布了四次,问题是我逃避了整个查询。

被遗漏并引起一些混乱的是围绕查询的代码。就像这样

$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);在代码的其他地方删除和添加转义。

4

6 回答 6

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'
)";
于 2011-11-08T17:48:13.577 回答
1

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

你想清理每个输入,有点像这样:

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

然后您将使用局部变量而不是输入来构建您的 SQL 命令。

此外,您可能希望查看诸如PDO之类的数据访问权限,它会为您管理很多细节。

于 2011-11-08T17:50:21.550 回答
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)"
于 2011-11-08T17:49:18.717 回答
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
)";
于 2011-11-08T17:55:06.973 回答
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       );";
于 2011-11-08T17:51:29.487 回答
0

关闭 magic_quotes_gpc 并使用准备好的语句。

禁用 magic_quotes_gpc 后,您最终不会自动转义输入 - 而且 magic_quotes_gpc 无论如何都已弃用。

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

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

于 2011-11-08T17:58:32.293 回答