我可以在预处理语句中混合使用非边界参数吗?

Can i mix non bounded parameters in prepared statements?

提问人:gom 提问时间:1/20/2020 最后编辑:Dharmangom 更新时间:1/20/2020 访问量:137

问:

就像我在这里所做的那样:$_SESSION['userid']

function changeEmail($newEmail){
    $stmt = $mysqli->prepare("update `users` set `email`=? where `userid`={$_SESSION['userid']} limit 1");
    $stmt->bind_param('s',$newEmail);
    return $stmt->execute();
}

因为:的值是从数据库生成的(通过auto_increment整数),因此没有SQL注入的风险。另外,我假设连接值比绑定快一点。$_SESSION['userid']

php mysql mysqli 准备语句 sql 注入

评论

8赞 RiggsFolly 1/20/2020
你可以,但它仍然不安全。为什么不安全,我听到你问?因为你可能没有确保你放入 SESSION 的任何东西都是 100% 安全的,即使你这样做了,因为它是会话,其他人编写的代码可能会在那里放置东西,所以你必须相信他们也小心翼翼地做了。这是不值得冒险的
1赞 Paul Spiegel 1/20/2020
你的两个假设是错误的。但是,是的 - 您也可以出于错误的原因将它们混合在一起。
3赞 ADyson 1/20/2020
除此之外,使用参数的另一个附带好处是,它降低了连接字符串时可能发生的意外语法错误的风险 - 例如,如果您要添加“姓氏”字符串,而用户的姓氏是 - 它本身并不危险,但如果字符串没有正确转义,它会导致 SQL 语法错误。参数化做的一件事是为您正确处理转义。因此,即使您决定不担心其他威胁,出于这个原因,您也应该进行参数化。参数化根本没有好处O'Grady
3赞 Paul Spiegel 1/20/2020
@ADyson - 绑定的参数与准备好的查询分开发送到数据库。所以不 - 它们不会被“集成”到查询中。(除非在 PDO 中使用 ATTR_EMULATE_PREPARES - 不建议这样做。无论如何 - 使用绑定参数,您无需考虑转义特殊字符。
1赞 IsThisJavascript 1/23/2020
@gom是的,他们可以完全控制会话中的内容

答:

5赞 Dharman 1/20/2020 #1

是的,但你真的不应该!

3分:

  1. 您需要绑定所有参数,无论它们来自何处,否则您的代码仍然容易受到 SQL 注入的攻击。
  2. 绑定参数可以使代码更简洁。您无需担心正确的引用、插值或数据类型。
  3. 串联/插值没有任何好处。代码不会以任何方式更快、更清晰或更好。你已经绑定了一个参数,为什么不绑定其余的呢?

只要你把变量输入直接放在SQL中,你的代码就容易受到SQL注入的影响。始终使用数据绑定!