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

Php 在准备好的语句中传递一个文字变量和占位符?,php,mysqli,prepared-statement,Php,Mysqli,Prepared Statement,我正在创建一个将由用户提交的表单。在表单提交过程中,一些值硬编码在源代码中,并按原样插入。我可以将这些值直接传递给准备好的语句吗?我正在绑定的其他用户输入数据将替换为?占位符 例如: ... $litVariable = 1; $userInput = $_POST['user_input']; $myquery = $mysqli->prepare("INSERT INTO table(`column1`,`column2`) VALUES('$litVariable',?)

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

例如:

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

使用
$myquery->bind_param(“s)”,$user_input将
$litVariable
直接传递给查询和用户生成的输入是否安全,正如我上面所做的?

是的,您所做的应该是安全的,因为您连接到查询字符串中的值
$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);

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

当您的处理是统一的时,您不必测量您正在处理的每个变量,考虑它是否安全。你会得到回报的

  • 更快的编码。您不必停下来思考,这个特定的变量将如何被插入——按原样插入或准备插入。对于每个变量
  • 当你可以发誓一个变量是安全的,但实际上它不是时,就不可能出现人为错误
为了缓和这种情绪,我可以为你提供一个能让你准备好的问题不那么无聊的解决方案

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

只有两行有意义的代码而不是四行重复的代码。

这有什么具体原因吗,除了认识到mysqli参数绑定是迟钝的之外,您还需要确保任何值中没有任何引号-这就是为什么使用绑定值更容易的原因。
您还需要确保任何值中没有任何引号,您是指
$litVariable
?只要它从未由用户生成就可以了,如果您有一个“类型代码”,例如,如果它是一个常量值,那么为什么要将它包含在变量中?只需将常量值作为SQL的一部分,而无需任何变量插值。如果值来自PHP变量,则绑定它们。但是如果我确信
$litVariable
是安全的,那么根据准备语句的标准,这种方法正确吗?@StackOverflow问题是,安全还是不安全,如果使用语句,则无法注入。如果不将该值绑定为语句参数,则可能会出现注入。至少,那些后来继承您代码的人可能会疑惑您为什么选择这种方式。