【问题标题】:MySQL / PHP - Is this a good and secure way to escape in querys?MySQL / PHP - 这是一种在查询中转义的好方法吗?
【发布时间】:2012-07-13 19:41:36
【问题描述】:

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

我的代码:

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

【问题讨论】:

  • 谢谢,应该知道了。 :P
  • 你不应该使用 md5() 作为密码,它不再安全了。 (并且不使用盐就永远不会安全)。您应该始终在 PHP 端进行散列,否则密码可能/将最终出现在 MySQL 日志文件中。

标签: php security prepared-statement


【解决方案1】:

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

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

不过有几点建议:

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

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

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

【讨论】:

  • 他不是还容易受到XSS攻击吗?
  • 感谢您的回答! md5 只是现在,我稍后会提高密码安全性。我知道密码是一件大事,但我会进入它。当您说 $_POST 的检查或清理时,我猜您的意思是 if(isset($_POST['email'])) 等。关于声明是否成功,我刚刚开始准备声明,所以我不知道它的语法。您能否给我一个链接以获取有关它的一些简短信息?
  • @Paul - 我认为我的第二个要点涵盖了这一点,因为数据的清理和验证将涵盖这一点。为了 OP 的利益,here's more info on this.
  • @Utkanos 感谢您的链接。我提出来是因为我不是 100% 确定的。直到昨天,我还假设 PDO 对 XSS 也有效
  • @Oskwish - 查看prepared statements 和 MySQLI 的 PHP 文档。 execute() 在失败时返回 false,因此至少您可以按照 if (!$stmt-&gt;execute()) $error = 'something went wrong'; 的方式进行检查 回复:消毒,是的 - 检查值是否实际存在,并检查/清除它们是否有任何不受欢迎的内容。本质上,我们谈论的是验证。
猜你喜欢
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
相关资源
最近更新 更多