【问题标题】:Is this mysqli code using prepared statements safe against SQL injection?这个使用准备好的语句的 mysqli 代码对 SQL 注入安全吗?
【发布时间】:2014-01-28 06:55:42
【问题描述】:

我正在使用准备好的语句来防止 sql 注入。我想知道我是否在正确的轨道上,以防止使用准备好的语句进行 sql 注入。下面是一个示例 html 表单。

<form action="" method="post" name="ff" id="ff">
<input type="text" name="input1">
<input type="text" name="input2">
<input type="submit" value="submit" name="submit">
</form>

现在在提交上述表格时,我正在使用以下带有准备好的语句的 php 代码。

if(isset($_POST["submit"]))
{
    $query = "insert INTO table (input1,input2) VALUES (?,?)";
    $stmt = mysqli_prepare($link, $query);
    mysqli_stmt_bind_param($stmt, "ss", $_REQUEST["input1"], $_REQUEST["input2"]);
    $result = mysqli_stmt_execute($stmt);
    if ( false===$result ) {
        die('Statement failed: '.$stmt->error);
    }
}

请告诉我上面的带有准备好的语句的php代码是否可以防止sql注入的事情。 另外请确认我使用用户输入作为准备好的语句的参数,而不是通过将字符串连接在一起来构建 SQL 命令。

【问题讨论】:

  • 看起来不错,而且准备好的语句应该如何使用。
  • “另外请确认我使用用户输入作为准备好的语句的参数,而不是通过将字符串连接在一起来构建 SQL 命令。” - 确认。
  • 虽然可以避免 SQL 注入,但这并不意味着您仍然不应该审查您的输入变量(例如数字应该是数字),尤其是当您使用 $_REQUEST 来自 POST 表单的值时(如果表单是 POST 的,那么您应该确切知道 $_POST 和 $_GET 中的内容以及 $_COOKIE 中的内容等
  • 我在 PHP 网站上找不到任何说明 mysqli_stmt_bind_param 实际上正在像 mysqli_real_escape 一样清理参数的内容。你们确定它正在清理输入吗?
  • 它正在处理字符串值的转义,并用引号括起来......它不会清理,因为您可以在字符串值中嵌入标记等。 ...您仍然需要自己防止:数据库不知道您是否要将 &amp;lt; 更改为 &amp;lt; 等,但 mysqli_escape_string() 也不清理,它只是用转义引号替换字符串中的引号, 并且将变量绑定到准备好的语句会为您做到这一点

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

看起来不错。为什么要使用 $_REQUEST。它有一定的漏洞。改用 $_POST。您的代码绝对可以抵御 SQL 注入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2012-12-01
    • 2014-04-25
    • 2016-07-22
    相关资源
    最近更新 更多