MySQL escaped_strings VS.参数化查询

时间:2012-01-08 18:08:05

标签: mysql mysql-real-escape-string parameterized database-security

只是阅读参数化查询,这似乎是数据库防御的最后一个词,并且想知道以下内容:

我有一个现有的PHP / MySQL自建CMS,其中所有输入(条形复选框和单选按钮)都受real_escape_string的约束。有一个管理部分可通过sha1加密密码和匹配的用户名访问,其中一小组受信任的人可以更新内容(tinyMCE),上传照片等。严格的小时间。我的所有查询都没有参数化,但仅在转义后执行。

没有公众投入,但我确实希望稍后将其打开到用户提交的表格。

我的主人是私人主持人,记录非常好。

在其他条件相同的情况下,我有多安全?

2 个答案:

答案 0 :(得分:2)

mysql_real_escape_string 会立即保护您免受SQL注入攻击。我最近帮助了一个小网站的开发人员,他认为他在所有输入上都安全地调用了mysql_real_escape_string,但仍然得到了pwn'd。在他的情况下,他期望一个变量(通过GET字符串)是一个整数,但不是这样验证它。然后,攻击者利用该ID字段制作自定义查询并访问其整个数据库

故事的寓意?验证,验证,验证。您需要假设来自外部的所有可能的数据(即使它是您填充的<input type="hidden">)是试图绕过安全措施。这是使用像Codeigniter等框架有用的地方,因为它们内置了验证组件。如果你想自己做所有事情,请小心,并检查所有输入变量。

答案 1 :(得分:1)

我宁愿使用参数化/准备好的语句。与只是转义输入相比,它们允许您指定方便的类型(例如,您没有将日期时间值转换为特定于服务器的格式),并且它还解决了由不同RDMS处理转换错误时的模糊性。例如,查询SELECT * FROM table1 WHERE int_field='aaa'(int_field为整数)在Mysql中返回int_field等于0的记录,在Oracle和SQLServer中引发错误,并在SQlite中返回空集