在sql查询上检查什么模式以进行可能的注入?

yptwkmov  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(375)

我想通过检查sql查询来检测可能的sql注入。我使用pdo和准备好的声明,所以希望我没有被人攻击的危险。但是,我想检测的是输入/结果查询字符串可能会成为一个危险的查询。例如,我的应用程序——正确地——永远不会生成“1=1”查询,因此我可以检查生成的查询字符串,并标记生成该查询的用户/ip。与“drop table”相同,但可能我只能通过循环输入数组来检查;或者我应该再次检查生成的查询。我使用的是mysql,但对于其他驱动程序的模式也很感激。
我已经阅读了regex来检测sql注入,其中一些注解正朝着这个方向发展。为了帮助我,我正在为很少使用英语作为输入的用户开发,因此在查询上进行一个简单的/drop/match就足以记录用户/查询以供进一步检查。我在研究sql注入时发现的一些模式是:
句子中间的分号——尽管这可能很常见
双破折号/磅号用于注解查询的其余部分
在值的开头和结尾使用引号
使用十六进制(我的目标用户在表单中输入0x的几率很小到很低)
declare/exec/drop/1=1(我的应用程序不应生成这些值)
html标记(来自预期用户/用例的低概率)
等。
通过在生成查询字符串之前循环输入值,可以更容易地检测到以上所有内容,因为它们没有被转义。但我错过了多少(很多,我想)还有什么不清楚的模式我应该检查?检查生成的查询怎么样?有什么可能出现的模式吗?
热释光;dr:什么模式匹配sql查询(mysql)来检查可能的注入?我将pdo与prepared语句和值绑定一起使用,因此检查用于日志/警报目的。

vsdwdz23

vsdwdz231#

但我错过了多少?
你猜对了。创建一个庞大的黑名单并不能使你的代码免疫。这种做法已经成为历史。其他问题也遵循同样的思路。
您的最佳选择是:
验证输入数据(输入不一定来自外部方)
使用事先准备好的语句。
几步,但防弹。

dluptydi

dluptydi2#

我们店里有两条规矩。
在sql查询中始终使用参数。
如果由于某种原因您不能遵循规则1,那么输入到查询中的每一条数据都必须进行清理,或者 intval() 对于整数参数或适当的函数,可以根据应用程序数据类型清除字符串变量。例如,个人名称可能是 Jones 或者 O'Brien 或者 St. John-Smythe 但除了撇号,永远不会有特殊的字符 ' ,连字符 - 、空格或点 . 产品编号可能只包含字母或数字。等等。
如果2太难遵循规则1。
我们检查代码以确保我们在做这些事情。

3j86kqsm

3j86kqsm3#

不可能。
你将在军备竞赛中度过余生——你建立防御,他们建立更好的武器,然后你建立防御,等等。
也许可以写一个“简单的” SELECT 这需要24小时才能完成。
除非您锁定这些表,否则它们可以查看加密的密码,然后使用 root 登录。
如果您允许任何类型的字符串,那么处理引用的各种组合将是一个挑战。
使用半有效的utf8字符串可以做一些糟糕的事情。
那你呢 SET 声明。
以及 LOAD DATA .
和存储过程。
相反,决定允许的最小查询集,然后将其参数化,以便可以单独检查或转义这些片段。然后构建查询。

相关问题