mysql - 在 SQL 查询中检查可能的注入的模式是什么?
问题描述
我想通过检查 SQL 查询来检测可能的 SQL 注入攻击。我正在使用 PDO 和准备好的声明,所以希望我没有被别人攻击的危险。但是,我要检测的是输入/结果查询字符串可能成为危险查询的可能性。例如,我的应用程序——正确地——永远不会生成“1=1”查询,所以我可以检查生成的查询字符串,并标记产生该查询的用户/IP。与“drop table”相同,但也许我只能通过循环输入数组来检查;或者也许我应该重新检查生成的查询。我正在使用 MySQL,但其他驱动程序的模式也很受欢迎。
我已经阅读了 RegEx to Detect SQL Injection并且一些评论正朝着这个方向发展。在我的帮助下,我正在为很少使用英语作为输入的用户进行开发,因此查询上的简单 /drop/ 匹配可能足以记录用户/查询以供进一步检查。我在研究 SQL 注入时发现的一些模式是:
- 句子中间的分号——尽管这可能很常见
- 双破折号/磅符号用于评论查询的其余部分
- 在值的开头和结尾使用引号
- 使用十六进制(我的目标用户在他们的表单中输入 0x 的机会很小到很低)
- declare/exec/drop/1=1(我的应用程序不应该生成这些值)
- html 标签(来自预期用户/用例的可能性很小)
- 等等
通过在生成查询字符串之前循环输入值,上述所有内容都更容易检测到,因为它们没有被转义。但我错过了多少?(很多,我猜)我应该检查任何其他晦涩的模式吗?检查生成的查询怎么样?任何可能出现的模式?
tl;dr:什么模式可以匹配 SQL 查询(MySQL)来检查可能的注入?我将 PDO 与准备好的语句和值绑定一起使用,因此该检查用于日志记录/警报目的。
解决方案
在我的商店里,我们有两条规则。
- 始终在 SQL 查询中使用参数。
- 如果由于某种原因您不能遵循规则一,则必须对放入查询的每条数据进行清理,使用
intval()
整数参数或适当的函数来根据其应用程序数据类型清理字符串变量。例如,个人名称可能是Jones
orO'Brien
,St. John-Smythe
但绝不会包含除撇号'
、连字符-
、空格或点之外.
的特殊字符 产品编号可能仅包含字母或数字。等等。
如果 2 太难,请遵循规则 1。
我们检查代码以确保我们正在做这些事情。
推荐阅读
- python - PySpark:基于公共字符串列比较两个数据框并生成结果布尔 withColumn()
- java - 将 Spring 批处理连接到 Spring 集成工作流
- java - 创建子类或将类型设置为字符串?
- postgresql - Postgres中用户定义的连接功能?
- javascript - 改变反应原生tabBar的背景颜色
- java - 如何从 SSLContext 获取 SSL 证书到期日期?
- python - 无法在 TKinter 中显示图像
- indexing - Solr/Lucene 文档中的部分更新
- r - 新列返回分组数据中的最大值
- python - 如何在包含美元符号的 Django 视图中捕获完整的 url?