无法使用 mysql_real_escape_string 登录我的站点

Can not login in my site with mysql_real_escape_string

我需要一些帮助。我用 "login" 系统编写了某种站点并试图防止 SQL 注入。没有那个转义字符串,一切都完美无缺。当我添加 mysql_real_escape_string() 时,我无法再登录我的网站,这很烦人。

我不知道哪里出了问题,曾尝试 google 解决问题但没有找到任何问题。所以我有一个表单,它通过 $_POST['user'] 和 $_POST['pass'] 将有关用户的信息发送到 check.php。在 check.php 我有代码来检查用户和传递是否与用户相等并传入 MySQL 数据库。

<?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');
    };
};

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

如果用户名和密码只包含字母数字字符,请尝试使用 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- 的评论为您提供了调试代码的好方法。

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

例如

$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 的 return 值,那么您要比较的值应该 是等效的 "escaped" 值。

例如,考虑:

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

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

mysql_real_escape_string 编辑的值 return 是 "escaped",因此它可以包含在 SQL 文本中。


补充说明:

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

不检查来自 mysql_query 的错误 return 是个坏主意。

当有两个合适的替代品(mysqliPDO)可用时,使用已弃用的 mysql 界面不是一个好主意。特别是当两个替换都支持 prepared statements with bind placeholders.

在 SELECT 列表中使用 *,然后按结果集中列的位置引用 return 列也是一个坏主意。最好列出您想要 return.

的特定列