美文网首页Python七号
Python操作db2数据库时如何防止SQL注入

Python操作db2数据库时如何防止SQL注入

作者: somenzz | 来源:发表于2019-08-01 22:17 被阅读10次

    SQL注入就是攻击者在前端的表单输入中,或者 API 的传参时,按照 SQL 的语法,人为地加入一段代码,改变原有的SQL 逻辑,来跳过验证,篡改或者删除数据库,达到攻击者的目的的过程。

    SQL注入攻击会造成非常严重的后果,举个例子:

    select user_id,user_name from user_info where user_name = '$a' and passwd = '$pwd'
    

    一般情况下,参数 user_name,pwd 都是从前端的界面中的文本框输入的,但是:

    如果攻击者在 pwd 的文本框中输入以下字符串:

    xxx' or 1=1 
    

    那么到了后端,SQL 拼接的情况就成了:

    select user_id,user_name from user_info where user_name = '$a' and passwd = 'xxx' or 1 =1
    

    这样就跳过了密码验证。

    如果攻击者在 pwd 的文本框中输入以下字符串:

    xxx' or 1=1 ; delete from user_info 
    

    那么到了后端,SQL 拼接的情况就成了:

    select user_id,user_name from user_info where user_name = '$a' and passwd = 'xxx' or 1 =1 ; delete from user_info ;
    

    一执行,不但跳过的验证,还删除了所有的用户信息,可以想象下,如果是 drop database 呢,整个数据库立即消失。

    如何防止SQL注入?

    方法一:仍使用字符串拼接的方法,但对SQL进行案例检查。

    检查的方法包括:

    • 限制单条 SQL 语句,对应SQL语句中不能有分号。
    • 防止将 where 条件失效,对应SQL语句中不能出现SQL语法中的注释符号,如 -- ,/**/ 等。
    • 禁止出现危险操作,对应SQL语句中不能出现 delete、drop、create 等关键词。
    • 在不影响 SQL功能的前提下,禁止SQL语句中出现 or 这种可以改变逻辑规则的词

    以上检查操作在 Python 中使用正则表达式一句话就可以搞定:

    if re.findall(r';|--|/\*|delete|drop|create|or|\*/',sql.lower()):
        return False # False 说明SQL是不安全的
    

    方法二:使用数据库 API 的预编译功能,参数单独做为参数传递,以 ibm_db 为例:

    import ibm_db
    conn = ibm_db.connect("database","username","password")
    sql = "SELECT EMPNO, LASTNAME FROM EMPLOYEE WHERE EMPNO > ? AND EMPNO < ?"
    stmt = ibm_db.prepare(conn, sql)
    max = 50
    min = 0
    # Explicitly bind parameters
    ibm_db.bind_param(stmt, 1, min)
    ibm_db.bind_param(stmt, 2, max)
    ibm_db.execute(stmt)
    # Process results
    
    # Invoke prepared statement again using dynamically bound parameters
    param = max, min, 
    ibm_db.execute(stmt, param)
    

    总结:

    方法二仅适用于将 where 条件中的字段值做为参数传递的情况,假如表名是通过参数传递,或者 select 中的字段名也是通过参数传递的话,只能使用方法一,因此只要 SQL 语句中对防止注入的安全性检查做的好,方法一更灵活,适用范围更广。

    今天写了一整天的数据 API 接口,在防止 SQL 注入有了点认识,特分享出来,希望对你有所帮助。

    关注公众号 somenzz 和我一起学 Python 吧。

    (完)

    相关文章

      网友评论

        本文标题:Python操作db2数据库时如何防止SQL注入

        本文链接:https://www.haomeiwen.com/subject/egrhdctx.html