0

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

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

没有来自公众的意见,但我确实想稍后将其开放给用户提交的表格。

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

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

4

2 回答 2

2

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

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

于 2012-01-08T18:14:09.950 回答
1

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

于 2012-01-08T18:27:31.110 回答