在准备好的语句中传递一个文字变量和占位符?

Passing one literal variable as well as placeholders in prepared statement?

我正在创建一个将由用户提交的表单。在表单提交过程中,一些值被硬编码在源代码中并按原样插入。我可以将这些值直接传递给准备好的语句吗?我绑定的其他用户输入数据将替换为 ? 占位符。

例如:

...
$litVariable = 1;
$userInput   = $_POST['user_input'];
$myquery     = $mysqli->prepare("INSERT INTO table(`column1`,`column2`) VALUES('$litVariable',?)");
$myquery->bind_param("s",$user_input);
...

像我上面所做的那样,将 $litVariable 直接传递给使用 $myquery->bind_param("s",$user_input); 的查询和用户生成的输入可以安全吗?

是的,您所做的应该是安全的,因为您连接到查询字符串中的值 $litVariable 并非来自外部。这意味着 VALUES 子句中的第一项应该 而不是 容易受到来自外部的注入攻击。话虽如此,我仍然建议甚至不要这样做,因为它会使您的插入查询看起来容易受到攻击。没有理由不到处使用绑定参数。也就是说,我建议如下:

$litVariable = 1;
$userInput = $_POST['user_input'];
$sql = "INSERT INTO table(column1, column2) VALUES (?, ?)";
$myquery = $mysqli->prepare(sql)
$myquery->bind_param("is", $litVariable, $user_input);

这个问题更多的是关于心理学而不是技术。

当你的处理是统一的时,你不必衡量你正在使用的每一个变量,考虑它是否安全。您将获得 return

  • 更快的编码。您不必停下来思考这个特定变量将如何插入——按原样或准备。对于每一个变量。
  • 当您可以发誓某个变量是安全的但实际上并非如此时,就不会出现人为错误

为了软化药丸,我可以给你一个 mysqli helper function 让你准备好的查询不那么无聊

$sql = "INSERT INTO table(column1, column2) VALUES (?, ?)";
prepared_query($mysqli, $sql, [$litVariable, $userInput]);

只有两行有意义的代码与四行重复的代码。