我正在关注如何创建登录系统的教程 Creating a Secure Login System the Right Way 。在代码中,他们在用户名字段中使用mysql_real_escape_string
,然后将其作为查询传递给数据库,即
$username = mysql_real_escape_string($username);
这是必要的,因为我没有向数据库添加任何内容,我只是检查该用户是否已经存在?
我不仅仅是离开它的原因是当我使用上面的代码时,它将我的文本呈现为空白,因此向数据库发送一个空字符串。我不知道为什么会这样,所以我想,如果我能把它留下来,我愿意。
以下是有关从评论者打开数据库连接的建议(密码等已更改):
function dbConnect(){
$connection = mysql_connect('localhost', 'username', 'password');
$database=mysql_select_db('database', $connection);
return $connection;
}
$username = $_POST['username'];
$password = $_POST['password'];
$password = md5($password);
$username = mysql_real_escape_string($username);
$query = mysql_query("SELECT *
FROM members
WHERE username = '$username'
AND password = '$password'",dbConnect());
答案 0 :(得分:1)
您可能想要使用PDO with prepared statements。准备好的语句就像SQL查询中的占位符一样,您稍后会将数据发送到那些地方。这使得转义字符串过时了。
正如我在上面的评论中已经提到的那样:每个带有用户输入的SQL查询都容易受到SQL injection攻击。
答案 1 :(得分:1)
正确的代码是:
dbConnect();
$username = mysql_real_escape_string($_POST['username']);
$password = md5($_POST['password']);
$sql = "SELECT * FROM members WHERE username = '$username' AND password = '$password'";
$res = mysql_query($sql) or trigger_error(mysql_error().$sql);
答案 2 :(得分:0)
是的,因为username
可能包含SQL中不允许转义的特殊字符,例如'
或/
示例:
在用户名'
中不转义McDonald's
会导致非法的SQL语句:
select * from your_table where username = 'McDonald's'