Mat*_*att 7 php mysql sql-injection
我一直在编码我的网站在PHP最近,我对我的好我的消毒输入之前我在查询中使用它的做法很为自己感到骄傲.这一切都很顺利,直到我的朋友说我需要消毒我的输入.当我试图向他解释它已被消毒时,他告诉我他已经在我的数据库中的"用户"表中找到了所有内容.我不知道怎么样,所以我想我会发布我做错了什么让我的消毒不起作用.这是他正在利用的PHP代码:
start_mysql(); // Starts the databases stuff, etc.
$id = mysql_real_escape_string($_GET['id']);
$game = mysql_query("SELECT * FROM `games` WHERE `id` = $id LIMIT 0, 1");
Run Code Online (Sandbox Code Playgroud)
他所做的只是更改id参数,使他能够在我的数据库上使用SQL注入.我以为mysql_real_escape_string逃脱了所有这样的角色,但显然我错了.我用一个普通的字符串做了一些测试,看看会发生什么,这就是它所说的
网址:/game.php?id ='或''='
echo($_GET['id']); // This echo'd: \' OR \'\' = \'
echo(mysql_real_escape_string($_GET['id'])); // This echo'd: \\\' OR \\\'\\\' = \\\'
Run Code Online (Sandbox Code Playgroud)
所以,我的简单问题是,我做错了什么?
马特,
mysql_real_escape_string() 只会过滤某些字符,如果您确实想防止注入攻击,请查看另一篇 Stack Overflow 文章,建议您使用准备好的语句:
编辑:另请查看 Slaks 和 Michael 的关于将变量用单引号括起来的帖子。
祝你好运!
H