python -- 防止sql注入
错误的sql写法:
即基于用户输入的变量:id、type,直接拼接成一句sql语句,而不对输入参数进行校验,这样当用户输入脏数据时,可能会对数据库中的数据进行修改、污染!
正确的sql写法:
即不直接进行sql语句拼接,而是将未拼接的sql语句、参数args,同时输入到数据库相关包的cur.execute函数中,execute函数会先对args参数进行参数校验,然后再执行sql语句!这样就安全了。
如果输入为:
sql = f”SELECT a.road_id FROM {SCHEMA}.{TABLE} a where a.s_node_id = %s” # 这里的schema、table名虽然是常量,但是也是任务启动时配置的环境变量,是外部输入,需要进行正则化参数校验!
这里,正则化校验函数如下:
def check_expression(input_expression: str) -> str:
"""
使用大写字母、小写字母、数字、下划线(‘_’ or ‘-’)进行正则表达式检查, 检查输入的字符串中是否只含有大写字母、小写字母、数字、下划线(‘_’ or ‘-’);
:param input_expression: "cross_roadsection_info"
:return: "cross_roadsection_info"
"""
pattern = re.compile(“^[A-Za-z0-9_-]+$”) # 其中,’^’ :匹配字符串的开头,标识字符串的开头;[A-Za-z0-9_-]匹配:大写字母或小写字母或数字或’_’或’-’; ’+’:匹配1个或多个字符;’$’匹配:字符串的末尾,标识字符串结束
m = pattern.match(input_expression)
if m:
return input_expression
else:
raise ValueError(“The input expression {} is unsafe!”.format(input_expression))
所以这种情况下,正确的写法为:
sql = f”SELECT a.road_id FROM {check_expression(SCHEMA)}.{check_expression(TABLE)} a where a.s_node_id = %s”
args = (cross_name, ) # 输入参数args的类型是:tuple
然后执行:cur.execute(sql, args)
- 点赞
- 收藏
- 关注作者
评论(0)