无法使用mysql_real_escape_string在我的站点中登录

时间:2015-01-22 18:47:43

标签: php mysql mysql-real-escape-string

我需要一些帮助。我用“登录”系统编写了某种类型的网站,并试图阻止SQL注入。一切都很完美,没有逃脱字符串的东西。当我添加mysql_real_escape_string()时,我无法再登录我的网站了,这很烦人。

我不知道应该是什么错误,试图谷歌问题,但没有找到任何东西。所以我有一个表单,通过$ _POST ['user']和$ _POST ['pass']将有关用户的信息发送到check.php。在check.php中,我有代码来检查用户是否与用户等同并传入MySQL DB。

<?php
include ('mysql.php'); // includes mysql connection
    if(isset($_POST['user']) && isset($_POST['pass'])) {
    $user = mysql_real_escape_string($_POST['user']);
    $pass = mysql_real_escape_string($_POST['pass']);
    $row = mysql_fetch_row(mysql_query("SELECT * FROM users WHERE username = '$user'"));

    if(($user == $row[1]) and ($pass == $row[2])) {
        setcookie("user",$user,time() + 3600,"/");
        header('location: secret.php'); 
    } else {
        header('location: index.php');
    };
};

用户名和密码只包含字母和数字,我知道我正在输入用户名和密码。

2 个答案:

答案 0 :(得分:2)

如果用户名和密码仅包含字母数字字符,请尝试使用 ctype_alnum ( string $text )所以你只需验证$ user和$ pass是否只是字母数字字符。如果它们(如果它返回真实),那么你就不需要对它们进行消毒。

顺便说一下,你现在应该使用 mysqli_real_escape_string而不是mysql_real_escape_string! 不推荐使用mysql_ *函数。

我希望它会有所帮助

看看这个已经解决的类似问题: http://forums.phpfreaks.com/topic/68338-solved-cant-login-using-mysql-real-escape-string/

编辑:另外,Fred -ii-的评论为您提供了调试代码的好方法。

答案 1 :(得分:1)

您只需要使用mysql_real_escape_string on将包含在SQL文本中的值。

e.g。

$user = $_POST['user'];
$pass = $_POST['pass'];

$sql = "SELECT * FROM users WHERE username = '" . mysql_real_escape_string($user) . "'";

    ... mysql_query($sql) ...

稍后在您的代码中,您将$user的内容与其他内容进行比较。如果$user包含来自mysql_real_escape_string的返回值,那么您要比较的内容是等效的“转义”值。

举个例子,考虑一下:

$bar = mysql_real_escape_string($foo);
if ( $bar == $foo ) {

根据$foo的值,$bar中存储的字符串可能不相等。

mysql_real_escape_string返回的值被“转义”,因此可以包含在SQL文本中。


附加说明:

以纯文本格式存储密码是一个非常糟糕的主意。

不检查mysql_query返回的错误是个坏主意。

当两个合适的替换(mysqlmysqli)可用时,使用已弃用的PDO接口是一个坏主意。特别是当两个替换都支持准备好的语句绑定占位符时。

在SELECT列表中使用*,然后引用结果集中列的位置返回的列也是一个坏主意。列出要返回的特定列是最佳做法。