2011-05-23 56 views
5

我正在为我的网站编写一个身份验证系统,我想确保我的SQL注入受到保护。我使用的是'mysql_real_escape_string',但是这完全清除了字符串。用户名就像'Damo',但是通过该功能后,它就消失了。mysql_real_escape_string删除整个字符串

我在做什么错? (它没有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")); 
+0

您是否打开了魔术引号? (get_magic_quotes_gpc()) – 2011-05-23 21:19:36

回答

7

mysql_real_escape_string需要连接。假设连接已被创建为同一个库的一部分。

然而,mysql_real_escape_string不是面向对象的基础,而你清楚地使用一些其他库,供您OO $query是什么呢?)。因此mysql_real_escape_string无法“看到”您正在使用的连接,因此无法正常工作。

如果你打开错误报告(你真的应该),你应该看到为此生成的E_WARNING

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

+0

我是个白痴。 mysql_real_escape_string已经包含在我正在使用的SQL连接类中。 感谢您的意见,这让我看到了正确的地方。 – Damo 2011-05-23 21:30:27

+0

@Damo:没问题。绝对使用你正在使用的库中提供的函数;它会知道你创建的连接,因此它会正常工作。并打开错误报告!祝你好运! – 2011-05-23 21:35:16

-1

试试这个片段,我认为你错了什么是actully发生。

$user_name = $_POST["username"]; 
echo 'before: '.$user_name; 
$user_name = mysql_real_escape_string($user_name); 
echo 'after: '.$user_name;