【发布时间】:2015-11-16 23:05:55
【问题描述】:
- 不要将撇号 (
') 存储在数据库的字符字段中,而是始终将撇号转换为一些独特的替代符号,这些符号不被识别为 SQL 语法,并且在您的数据中不太常见或有意义. - 当接收来自 GET、POST 等的直接用户输入时,始终通过将值中的撇号转换为您选择的替代符号来过滤掉它们。
- 对于包含用户输入的所有 SQL 语句,始终将撇号包裹在文字值周围。例如,像这样:
SELECT Name FROM Client WHERE TYPE = '1';。这应该强制将所有非撇号字符视为文字值本身的一部分,无论它们是反引号、花括号、分号、反斜杠、正斜杠等。所以像SELECT Name FROM Client WHERE TYPE = ' -- /* comment the rest ';不会有不同的解释。 - 每当将用户输入合并到 SQL 语句的非文字部分(例如 ORDER BY 子句中的列名)时,从值中完全过滤掉标点符号,或根据预定义的安全集对其进行验证。
- 无论何时从您的数据库输出数据(到 HTML、XML 等),始终通过将您选择的替代符号替换为撇号来反转此过滤过程,以便客户可以很好地阅读内容。
(注意:我们使用的是 SQL Server,它不会将反引号符号识别为有效的 SQL 标点符号,但如果使用 MySQL,我们还需要翻译反引号。)
我已经用每个可以想象到的可能阻塞 SQL 的符号对此进行了测试,到目前为止它已经经受住了一切。我有没有忽略什么?在我在生产系统上尝试之前,我想获得一些社区反馈。
我们的环境:
- Linux(不是 Windows)
- PHP 5.4
- ADOdb 版本? (文档:旧 = http://phplens.com/lens/adodb/docs-adodb.htm ;新 = http://adodb.sourceforge.net/)
- 驱动程序 = "mssql"
【问题讨论】:
-
我不喜欢更改数据的想法,因为这样您就会面临数据丢失的可能性。有什么理由准备好的陈述还不够吗?
-
很遗憾,我们在 PHP 中使用了旧版 ADODB 驱动程序。它不像新的 PDO 驱动程序那样支持参数化 SQL。
-
@JohnDoe 这个细节需要添加到问题中。但是您使用的是什么版本的 PHP?我假设这是在 Windows 上运行的?你指的是这个 ADODB 用法:php.net/manual/en/class.com.php 吗?或者这个:phplens.com/lens/adodb/docs-adodb.htm?什么版本的 ADODB 驱动程序?
-
嗯,那应该是个好消息,因为即使查看过时的文档(版权截至 2012 年 - v5.18),ADOdb 确实 支持两个参数化查询 和存储过程(本质上是参数化的):请参阅phplens.com/lens/adodb/docs-adodb.htm#prepare 和phplens.com/lens/adodb/docs-adodb.htm#preparesp。他们甚至提到了 PDO(去这里和它的下一个小节:phplens.com/lens/adodb/docs-adodb.htm#connect_ex)但我不确定这是否有用或无用(另见adodb.sourceforge.net/docs-adodb.htm#php5)。
-
天哪,我该死。谢谢。自制黑客是纯粹的坏事,但这会更好。
标签: mysql sql-server security sql-injection