如何用Python正则检测分号、注释字符以防范SQL注入?
正则检测SQL注入特征的实现与拓展
一、编写检测目标符号的正则表达式
要匹配输入字符串任意位置的;、/*或*/,可以使用以下正则:
[;]|/\*|\*/
[;]:匹配单独的分号(方括号包裹是习惯写法,也可直接写;)/\*:匹配注释起始符/*,*在正则中是特殊字符,需用\转义\*/:匹配注释结束符*/,同样需要转义*
二、整合后的检测代码
将新的正则规则加入原有列表,优化遍历逻辑后的代码如下:
import re # 包含原有SQL关键字检测与新增符号检测的规则列表 regex_terms = [ r'(D|d)(R|r)(O|o)(P|p).*(T|t)(A|a)(B|b)(L|l)(E|e)', r'(I|i)(N|n)(S|s)(E|e)(R|r)(T|t).*(I|i)(N|n)(T|t)(O|o)', r'[;]|/\*|\*/' ] user_input = { "first name": "Bob", "last name": "DROP TABLE", "email": "; malicious statement here", "example key": "/* */", "other example": "*/" } # 遍历所有输入键值对进行检测 for input_key, input_value in user_input.items(): for pattern in regex_terms: if re.search(pattern, input_value): print(f"检测到恶意输入: [{input_key}] -> {input_value}") break # 找到匹配项后终止当前正则检测,避免重复输出
运行这段代码会输出所有包含目标特征的输入:
检测到恶意输入: [last name] -> DROP TABLE 检测到恶意输入: [email] -> ; malicious statement here 检测到恶意输入: [example key] -> /* */ 检测到恶意输入: [other example] -> */
三、其他常见SQL注入类型
除了你关注的注释符、分号堆叠注入,还有这些典型的SQL注入场景需要了解:
- 基于错误的注入:构造特殊SQL语句触发数据库报错,从报错信息中提取数据库结构、数据等敏感内容
- 联合查询注入:利用
UNION SELECT语句拼接合法查询与恶意查询,将非法查询结果混入正常返回内容 - 盲注:
- 布尔盲注:通过判断SQL语句执行后的布尔结果(如
AND 1=1返回正常,AND 1=2返回异常)来逐字符猜解数据 - 时间盲注:通过插入
SLEEP()等延迟函数,根据响应时间判断语句是否执行成功,从而猜解信息
- 布尔盲注:通过判断SQL语句执行后的布尔结果(如
- 绕过过滤的注入:攻击者通过大小写混淆(如
DrOp TaBlE)、多注释嵌套(如/*a*/DROP/*b*/TABLE)、字符编码(URL编码、Unicode编码)等方式绕过简单的正则过滤 - 存储过程注入:利用数据库内置存储过程(如MySQL的
LOAD_FILE()、SQL Server的xp_cmdshell)执行恶意操作,甚至获取服务器权限
重要提醒:正则过滤只能作为辅助手段,生产环境必须使用参数化查询(如Python中sqlite3的?占位符、psycopg2的%s占位符),从根源上避免SQL注入风险。
内容的提问来源于stack exchange,提问作者Mitchnoff
相关产品推荐
相关产品推荐

