python -- 防止sql注入

举报
bzp123 发表于 2022/08/11 20:20:44 2022/08/11
【摘要】 python防止sql注入的正确写法

错误的sql写法:

1660220297772402741.png

即基于用户输入的变量:idtype,直接拼接成一句sql语句,而不对输入参数进行校验,这样当用户输入脏数据时,可能会对数据库中的数据进行修改、污染!


正确的sql写法:

即不直接进行sql语句拼接,而是将未拼接的sql语句、参数args,同时输入到数据库相关包的cur.execute函数中,execute函数会先对args参数进行参数校验,然后再执行sql语句!这样就安全了。


如果输入为:

sql = fSELECT a.road_id FROM {SCHEMA}.{TABLE} a where a.s_node_id = %s”  # 这里的schematable名虽然是常量,但是也是任务启动时配置的环境变量,是外部输入,需要进行正则化参数校验


这里,正则化校验函数如下:

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 = fSELECT 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)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。