繁体   English   中英

PHP 防止 SQL 注入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM