这段代码是否安全 - PHP&& MySQL的

时间:2009-05-27 10:37:29

标签: phpunit

<?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'];

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

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

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

作为一个风格侧面说明,空构造函数没有意义,我建议返回布尔值true或false而不是字符串值。

最后,如其他地方所述,存储明文密码是一个坏主意。

答案 2 :(得分:2)

呃......你正在存储明文密码?这当然不安全。密码应使用sha256之类的盐进行哈希处理。存储明文密码永远不是一个好主意。

答案 3 :(得分:1)

没有。您不应该将原始密码存储在数据库中。将其储存(最好加盐)。此外,准备好的陈述是比逃避更好的选择。见PHP PDO documentation。作为额外的好处(除了安全性),它们可以更有效率。

答案 4 :(得分:1)

代码本身看起来不错,但我看到的主要问题是你在纯文本中传递密码。

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

如果在任何一种情况下,有人可以坐在电线上观察流量,那么您就遇到了安全问题。

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

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

我会将您的代码更改为

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

答案 5 :(得分:-3)

我认为没关系,但是,如果我担心安全性,我会将“username”的密码存储到变量中,并在查询之外进行比较。