MySQL/PHP-这是在查询中进行转义的一种好的、安全的方法吗


MySQL / PHP - Is this a good and secure way to escape in querys?

我终于找到了一种我认为是好的、安全的、快速的执行查询的方法,但我想在整个网站上实现它之前完全确定。

我的代码:

$email = $_POST['email'];
$displayName = $_POST['displayName'];
$pass = $_POST['pass1'];
if($stmt = $link -> prepare("INSERT INTO profiles (email, displayName, password) VALUES (?, ?, md5(?))")) {
        /* Bind parameters
            s - string, b - boolean, i - int, etc */
        $stmt -> bind_param("sss", $email, $displayName, $pass);
        /* Execute it */
        $stmt -> execute();
        echo "You are now registered.<br />";
        echo "<a href='"login.php'">Login</a>";

        /* Close statement */
        $stmt -> close();
    }

顺便说一句,stmt代表什么?

编辑,新代码:

    /* Create a prepared statement */
    $stmt = $link -> prepare("INSERT INTO profiles (email, displayName, password,
    dateRegistered) VALUES (?, ?, md5(?), NOW())");
    if ( false===$stmt ) {
      die('prepare() failed: ' . htmlspecialchars($link->error));
    }
    $rc = $stmt -> bind_param("sss", $email, $displayName, $pass);
    if ( false===$rc ) {
      die('bind_param() failed: ' . htmlspecialchars($stmt->error));
    }
    /* Execute it */
    $rc = $stmt->execute();
    if ( false===$rc ) {
      die('execute() failed: ' . htmlspecialchars($stmt->error));
    }
    echo "You are now registered.<br />";
    echo "<a href='"login.php'">Login</a>";

    /* Close statement */
    $stmt -> close();

是的-这是一个已准备好的语句,几乎可以避免SQL注入的风险,而SQL注入是已准备好语句的主要目的。

唯一的缺点是,当它们被用于必须处理不同查询的实用程序时,可能会很麻烦,比如说,具有动态数量的字段。不过,你可以用反射来绕过这一点。

不过,也有一些建议:

  • 密码的md5?可能不是最安全的选择。考虑使用加密盐(如果你用谷歌搜索的话,上面有很多东西)

  • 您似乎是直接从$_POST超全局获取数据,而不进行检查或sanisation,但我想这只是为了减少这个SO问题的代码片段的长度。永远不要直接从输入插入到查询-应该有一个验证/转义/编码等阶段。

  • 你似乎没有检查语句的执行是否成功——你假设它成功了,然后继续进行反馈。请先检查错误。

相关文章: