题
<?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'];
解决方案
中的代码可能是安全的,但实施并不大。 你不应该存储认证密码明文。的您应该盐和散列它。
我可以花一个小时来解释为什么,但你会做的更好只是阅读本。
其他提示
在查询本身出现安全的,但如果你使用了支持参数绑定,比如PDO或Zend_Db的一个DB接口,你就不必审查每个SQL语句这么紧张。
此外,mysql- *函数非常过时;你应该看看mysqli- *函数来代替。
作为一个文体方面说明,有一个空的构造函数是没有意义的,我会建议返回布尔真或假,而不是字符串值。
最后,如在别处所提到的,存储明文口令是一个好主意。
呃....你存储明文密码?这肯定是不安全的。密码应使用类似SHA256盐被散列。存储明文口令是不是一个好主意。
没有。你不应该存储在数据库中的原始密码。存储它散列(优选与盐)。此外,准备的声明比逃避一个更好的选择。看到这个 PHP PDO文档。作为一个附加的好处(除了安全性),它们可以是更有效的。
在代码本身看起来不错,但主要的问题,我看到的是,你身边路过的密码以纯文本。
是客户机到服务器的连接的安全的(即,使用SSL) 是服务器对数据库连接进行安全
如果在这两种情况下有人能够坐在电线和观看交通经过,那么你已经有了一个安全问题。
如果是我的话,我肯定会在客户端和服务器之间的SSL连接。
我会确保你在数据库中存储的密码的哈希值。
和我会改变你的代码,类似
//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
//Valid
我觉得是好的,但是,如果我是担心安全,我想“用户名”的密码存储到变量中,并查询外比较。
不隶属于 StackOverflow