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

6 回答 6

5

代码可能是安全的,但实现不是很好。您永远不应将身份验证密码存储为明文。你应该加盐和哈希。

我可以花一个小时解释原因,但你最好只阅读这个

于 2009-05-27T10:49:07.230 回答
4

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

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

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

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

于 2009-05-27T10:49:11.957 回答
2

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

于 2009-05-27T10:47:13.897 回答
1

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

于 2009-05-27T10:46:45.287 回答
1

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

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

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

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

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

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

//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
   //Valid
于 2009-05-27T10:50:54.840 回答
-3

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

于 2009-05-27T10:39:18.360 回答