$query = sprintf("SELECT firstname, lastname, address, age FROM friends
WHERE firstname='%s' AND lastname='%s'",mysql_real_escape_string($firstname),
mysql_real_escape_string($lastname));
使用像这样的查询代替
$query="select firstname, lastname, address, age FROM friends
WHERE firstname='".$_RETURN['name1']."', lastname='".$_RETURN['name2']."'";
这看起来是否合理..你有没有试过这种编码......以及它如何帮助防止任何恶意攻击..
答案 0 :(得分:5)
首先,这就是SQL-Injection。它基本上只是通过用户输入改变对数据库的查询的可能性。
让我们看一个例子:
查询:
SELECT temp1 FROM temp WHERE temp2 = 'VAR1';
现在我们将为VAR1指定以下值:'; DROP TABLE *; --
我们会得到:
SELECT temp1 FROM temp WHERE temp2 = ''; DROP TABLE *; --';
使用mysql_real_escape_string
,它看起来像这样:
SELECT temp1 FROM temp WHERE temp2 = '\'; DROP TABLE *; --'
mysql_real_escape_string
'保护'在查询中使用的字符串。
但最后,你应该完全停止使用mysql_*
。在防止SQL注入或其他方法对查询进行调整时,它们被弃用并被认为是不安全的。
You should simply stop concatenating queries together like this并开始使用prepared statements,它不仅更易于使用,默认情况下会阻止SQL注入,还可以提高应用程序的速度。
对于PHP,有两个扩展名旨在关闭整个mysql_*
已打开:
我再说一遍: 请停止使用mysql_*
!
答案 1 :(得分:3)
据我所知mysql_real_escape_string
is one of the better ways to prevent SQL injection,没有使用mysqli或PDO准备好的语句。
答案 2 :(得分:0)
使用像sprintf
这样的格式化功能纯粹是一种品味问题;第一个例子中的一大优点是函数mysql_real_escape_string
阻止了所有SQL注入(在其他一个答案中解释);不像PHP中有些不确定的magic_quotes_gpc
功能,很多人都依赖它。
magic_quotes_gpc
会自动逃避您在客户请求中收到的内容......但它无法检测到所谓的二级注入:
magic_quotes_gpc
阻止SQL注入;恶意字符串存储正确。magic_quotes_gpc
不会转义字符串。 Voilà,SQL注入;你的数据现在可能已经消失了。使用某种方式逃避自己,无论是mysql_real_escape_string
还是带有查询构建器(例如Adodb)的数据库抽象层,都绝对优于仅仅希望获得最佳效果。