doo*_*oor 9 php mysql mysqli prepared-statement
如果我使用MySQLi准备好的语句如下:
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
Run Code Online (Sandbox Code Playgroud)
我还需要逃避我的变量,例如$Session用mysqli_real_escape_string();象下面这样:
$Session = mysqli_real_escape_string($con1, $_COOKIE['Session']);
$stmt = $con1->prepare("UPDATE Login SET Session='LoggedOut' where Session=?");
$stmt->bind_param('s',$Session);
$stmt->execute();
$stmt->close();
Run Code Online (Sandbox Code Playgroud)
不,如果您在应用程序中的任何地方使用预准备语句,则可以安全地进行SQL注入.然而,一个重要的"陷阱"是二阶段注入攻击,当某些查询使用预准备语句而其他查询不使用时,会发生这种情况.
根据这个答案在SO类似的问题:
准备好的语句/参数化查询足以阻止该语句的第一顺序注入.如果在应用程序的任何其他位置使用未经检查的动态sql,则仍然容易受到二阶注入攻击.
总之,准备好的语句会在发送的数据与SQL查询本身之间产生分离,从而确保数据不会被误解为SQL查询.但是,攻击者仍然可以将SQL作为数据输入,虽然在使用预准备语句时首次存储它时不会执行,但在检索所述结果时仍必须谨慎.准备好的语句可以保护您在该特定位置的应用程序,但由于SQL仍然允许存储在数据库中,因此如果您以后在没有参数化的情况下使用该数据,则您的应用程序是不安全的.
这是您需要的唯一答案。
另一个答案中的所有混乱言论都无关紧要。这家伙试图告诉你,如果你足够愚蠢,不在所有地方使用准备好的语句,那么你就处于危险之中。这是很明显的,与准备好的语句本身无关。
| 归档时间: |
|
| 查看次数: |
3669 次 |
| 最近记录: |