python之sql注入

幸运草 2020年3月30日20:16:48安全防范评论阅读模式
sql注入攻击指的是通过构建特殊的输入作为参数传给web应用程序,或者向web应用做表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的sql命令,例如很多网站影视的vip会员泄露大多通过web表单查询字符暴露的

例如以下的sql

'select id,username from front_user where id=%s' % user_id

如果用户输入的是1 or 1=1,会将front_user表中的所有数据提取出来

防御

  • 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双'-'进行转换等。
  • 永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
  • 不要使用管理员权限的数据库连接,为每个应用使用单独的权限进行数据库连接
  • 不要把机密信息直接存放,加密或者hash掉密码或敏感信息
在Django中如何防御sql注入
  • 使用ORM来做数据的增删改查。因为ORM使用的是参数化的形式执行sql语句的。
  • 如果万一要执行原生sql语句,那么建议不要拼接url,而是使用参数化的形式
参数化sql查询

这里 execute 执行的时候传入两个参数,第一个是参数化的sql语句,第二个是对应的实际的参数值,函数内部会对传入的参数值进行相应的处理防止sql注入,

用字典传参
import  pymysql
db_mysql_config={
    'host':'',
    'port':3306,
    'user':'root',
    'password':'',
    'charset':'utf8',
    'db':''
}
conn = pymysql.connect(**db_mysql_config)
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
dict_parm = {"xn": "2015", "xq": "上学期"}
sql = """
                    SELECT
                        xm
                    FROM
                        edu_app_xqfx_jscq_js
                    WHERE
                        xn = %(xn)s
                    AND xq = %(xq)s
                    AND xm IS NOT NULL
                    LIMIT 3                                            
                       """
cur.execute(sql,dict_parm)
rows=cur.fetchall()
for row in rows:
    print(row)
conn.commit()
cur.close()
conn.close()
用列表传参
import  pymysql
db_mysql_config={
    'host':'',
    'port':3306,
    'user':'root',
    'password':'',
    'charset':'utf8',
    'db':''
}
conn = pymysql.connect(**db_mysql_config)
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
dict_parm = {"2015","上学期"}
sql = """
                    SELECT
                        xm
                    FROM
                        edu_app_xqfx_jscq_js
                    WHERE
                        xn = %s
                    AND xq = %s
                    AND xm IS NOT NULL
                    LIMIT 3                                            
                       """
cur.execute(sql,dict_parm)
rows=cur.fetchall()
for row in rows:
    print(row)
conn.commit()
cur.close()
conn.close()

结果为{'xm':'小明'}

执行mysql默认是元组格式,当pymysql.cursors.DictCursor,查询时,返回字典

cur = conn.cursor(cursor=pymysql.cursors.DictCursor)

本文来源于:python之sql注入-变化吧
特别声明:以上文章内容仅代表作者本人观点,不代表变化吧观点或立场。如有关于作品内容、版权或其它问题请于作品发表后的30日内与变化吧联系。

  • 赞助本站
  • 微信扫一扫
  • weinxin
  • 加入Q群
  • QQ扫一扫
  • weinxin
幸运草

发表评论