PHP防止SQL注入

时间:2017-10-11 11:38:11

标签: php mysql pdo sql-injection

我正在尝试使用PHP和PDO阻止SQL注入。我用它作为参考。 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers。我的代码没有给我任何错误,但进入的值都是null。

我试图插入的值是 null。我知道这是因为我已经回应了他们: echo "\nDate: ".$date." Name: ".$name." mail: ".$mail."Comment: ".$comment." website: ".$website;

$sql = "INSERT post SET timeDate = :timeDate and name = :name and mail = :mail and comment = :comment and website = :website";
$stmt = $db->prepare($sql);
$stmt->bindParam(":timeDate", $date);
$stmt->bindParam(":name", $name);
$stmt->bindParam(":mail", $mail);
$stmt->bindParam(":comment", $comment);
$stmt->bindParam(":website", $website);
$stmt->execute();

1 个答案:

答案 0 :(得分:0)

请勿在作业之间使用AND - 使用逗号。

$sql = "INSERT post
        SET timeDate = :timeDate,
            name = :name,
            mail = :mail,
            comment = :comment,
            website = :website";

您在语句之间使用AND的语句没有错误,因为该语句实际上是有效的。它只是做不到你想象的那样。

就好像你这样做了:

SET timeDate = (:timeDate and name = :name and mail = :mail and comment = :comment and website = :website")

这只将timeDate设置为一个长布尔表达式的结果。

其他列未分配任何内容,只是将它们与参数化值进行比较。由于这是一个尚未插入的新行,所有其他列自然为NULL,因此比较将为NULL。因此,AND - 将它们放在一起将为NULL,这是将分配给timeDate列的最终值。

在此语句中未为其他列分配任何值,并且它们的默认值可能为NULL。

这是一个奇怪而无用的陈述,但严格地说,这不是错误。

我也鼓励您更简单地使用PDO。您可以将数组传递给bindParam(),而不是将execute()用于所有内容。这与您为每个参数完成bindValue()的操作相同。您可以使用命名参数或位置参数执行此操作。

$stmt = $db->prepare($sql);
$stmt->execute([
  "timeDate" => $date,
  "name" => $name,
  "mail" => $mail,
  "comment" => $comment,
  "website" => $website]);

如果您已将参数值存储在数组中,这将非常方便。

防止SQL注入的保护与使用bindParam()一样好。