MySQL / PHP - 这是一种在查询中逃避的好方法吗?

时间:2012-07-13 22:35:48

标签: php security prepared-statement

我终于做出了我认为执行查询的良好,安全和快速的方法,但我希望在我在整个网站上实现它之前完全确定。

我的代码:

$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();

1 个答案:

答案 0 :(得分:2)

是的 - 这是一个准备好的声明,它几乎避免了SQL注入的风险,这是准备语句背后的主要目的。

唯一的缺点是,当用于必须处理不同查询的实用程序时,它们会很麻烦,例如,具有动态数量的字段。不过,您可以使用reflection to get round this

但有几点:

  • md5是否有密码?可能不是最安全的选择。考虑使用加密盐(如果你使用谷歌就可以使用加密盐)

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

  • 您似乎没有检查语句的执行是否成功 - 您认为它是,然后继续反馈。首先检查错误。