mysql_real_escape_string删除整个字符串

mysql_real_escape_string deleting entire string

提问人:Damo 提问时间:5/24/2011 更新时间:2/16/2018 访问量:2370

问:

我正在为我的网站编写一个身份验证系统,我想确保我受到保护,免受 SQL 注入的影响。我正在使用“mysql_real_escape_string”,但这完全清除了字符串。用户名类似于“Damo”,但在运行该功能后它就消失了。

我做错了什么?(无需mysql_real_escape_string即可正常工作)

$user_name = $_POST["username"];
$md5 = md5($_POST["password"]);

$user_name = mysql_real_escape_string($user_name);


$login = $query->GetSingleQuery("--SINGLE","SELECT user_name, id FROM url_users WHERE user_name='".$user_name."' and user_password='".$md5."';",array("user_name","id"));
php sql 注入

评论

0赞 Joe Phillips 5/24/2011
你打开了魔术报价吗?(get_magic_quotes_gpc())

答:

-1赞 user557846 5/24/2011 #1

试试这个片段,我认为你对实际发生的事情是错误的。

$user_name = $_POST["username"];
echo 'before: '.$user_name;
$user_name = mysql_real_escape_string($user_name);
echo 'after: '.$user_name;
7赞 Lightness Races in Orbit 5/24/2011 #2

mysql_real_escape_string需要连接。假定该连接已创建为同一库的一部分。

但是,它不是基于 OO 的,并且您显然正在为您的 OO 使用其他一些库(它是什么?所以无法“看到”您正在使用的连接,因此它无法工作。mysql_real_escape_string$querymysql_real_escape_string

如果您打开错误报告(您确实应该打开错误报告),您应该会看到为此生成的错误报告。E_WARNING

现在,我建议改为。它的使用可能与数据库连接的字符集不匹配,但它现在可以满足您的需求,并且不需要连接。理想情况下,使用通过实际使用的数据库库提供的转义函数。mysql_escape_string

评论

0赞 Damo 5/24/2011
我是个白痴。mysql_real_escape_string已包含在我正在使用的 SQL 连接类中。感谢您的输入,它让我找对了地方。
0赞 Lightness Races in Orbit 5/24/2011
@Damo:没问题。绝对使用您正在使用的库中提供的功能;它将知道您创建的连接,因此它将正常运行。并打开错误报告!祝你好运!