[英]PHP Prevent SQL Injection
我正在尝试使用带有 PDO 的 PHP 来防止 SQL 注入。 我用这个作为参考。 http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers 。 我的代码没有给我任何错误,但输入的值都是空的。
我试图插入的值不为空。 我知道这一点,因为我已经回显了它们: 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();
不要使用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。 您可以将一个数组传递给execute()
,而不是对所有内容使用bindParam()
execute()
。 这与您为每个参数执行bindValue()
所做的事情相同。 您可以使用命名参数或位置参数执行此操作。
$stmt = $db->prepare($sql);
$stmt->execute([
"timeDate" => $date,
"name" => $name,
"mail" => $mail,
"comment" => $comment,
"website" => $website]);
如果您已经将参数值存储在数组中,这将特别方便。
防止 SQL 注入与使用bindParam()
一样好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.