在MySQL中选择时是否有必要使用我的'sql_real_escape_string'?

时间:2012-05-02 18:16:02

标签: php mysql sql login

我正在关注如何创建登录系统的教程 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());

3 个答案:

答案 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'