我可以在准备好的语句中混合无界参数吗?

gom*_*gom -1 php mysql mysqli sql-injection prepared-statement

就像我在$_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();
}
Run Code Online (Sandbox Code Playgroud)

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

Dha*_*man 5

是的,但你真的不应该!

3分:

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

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