【问题标题】:Is this piece of code secure - PHP && MySQL这段代码安全吗 - PHP && MySQL
【发布时间】:2010-10-29 05:46:39
【问题描述】:
<?php
class test_class {

        public function __construct() { 

        }
        public function doLogin($username,$password) {

            include("connection.php");

            $query = "SELECT *
                      FROM users
                      WHERE username = '".mysql_escape_string($username)."'
                      AND password = '".mysql_escape_string($password)."'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result) {

            return 'no';
            }
            else 
                {
            return 'yes';
                }
            }


}
?>

上面的代码有效,但有点担心它是否安全。

注意:我没有使用 POST 方法,所以我必须将它作为函数中的参数接收,我不能使用。

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];

【问题讨论】:

    标签: phpunit


    【解决方案1】:

    代码可能是安全的,但实现不是很好。 您不应该将身份验证密码存储为明文。您应该对其进行加盐和哈希处理。

    我可以花一个小时解释原因,但你会做得更好just reading this

    【讨论】:

      【解决方案2】:

      查询本身看起来很安全,但如果您使用支持参数绑定的数据库接口,例如 PDO 或 Zend_Db,您就不必如此紧张地检查每条 SQL 语句。

      此外,mysql-* 函数已被弃用;你应该看看 mysqli-* 函数。

      作为文体方面的说明,空构造函数没有意义,我建议返回布尔值 true 或 false 而不是字符串值。

      最后,正如其他地方所提到的,存储明文密码是个坏主意。

      【讨论】:

        【解决方案3】:

        呃....您存储的是明文密码?那肯定是不安全的。密码应使用 sha256 之类的盐进行哈希处理。存储明文密码绝不是一个好主意。

        【讨论】:

          【解决方案4】:

          没有。您不应该将原始密码存储在数据库中。将其存储为散列(最好用盐)。此外,准备好的语句是比转义更好的选择。请参阅此PHP PDO documentation。作为额外的好处(除了安全性),它们可以更高效。

          【讨论】:

          • 他在问代码是否正常,而不是 mysql 实施 :)
          • 首先,代码必须被视为系统(包括数据库)的一部分,而不是孤立的。其次,我处理了实际代码。具体来说,不需要使用 mysql_escape_string ,因为准备好的语句是更好的解决方案。即使您仍然坚持手动转义,mysql_escape_string 也被弃用,取而代之的是 mysql_real_escape_string()。
          【解决方案5】:

          代码本身看起来不错,但我看到的主要问题是您以纯文本形式传递密码。

          客户端到服务器的连接是否安全(即使用 SSL) 服务器到数据库的连接是否安全

          如果在任何一种情况下,有人可以坐在电线上观看路过的交通,那么你就有安全问题了。

          如果是我,我肯定会在客户端和服务器之间建立 SSL 连接。

          我会确保您将密码的哈希值存储在数据库中。

          我会将您的代码更改为类似

          //Pseduo Code
          SELECT * FROM Table where UserName = $username
          Get Row Back
          if(MD5Hash($password) == DataRow[Password])
             //Valid
          

          【讨论】:

            【解决方案6】:

            我觉得还可以,但是如果我担心安全性,我会将“用户名”的密码存储到变量中,并在查询之外进行比较。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-02-20
              • 1970-01-01
              • 2023-04-10
              • 2011-05-18
              相关资源
              最近更新 更多