• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    pymysql如何解决sql注入问题深入讲解

    1. SQL 注入

    SQL 注入是非常常见的一种网络攻击方式,主要是通过参数来让 mysql 执行 sql 语句时进行预期之外的操作。

    即:因为传入的参数改变SQL的语义,变成了其他命令,从而操作了数据库。

    产生原因:SQL语句使用了动态拼接的方式。

    例如,下面这段代码通过获取用户信息来校验用户权限:

    import pymysql
    
    sql = 'SELECT count(*) as count FROM user WHERE id = ' + str(input['id']) + ' AND password = "' + input['password'] + '"'
    cursor = dbclient.cursor(pymysql.cursors.DictCursor)
    cursor.execute(sql)
    count = cursor.fetchone()
    if count is not None and count['count'] > 0:
     print('登陆成功')

    但是,如果传入参数是:

    input['id'] = '2 or 1=1'

    你会发现,用户能够直接登录到系统中,因为原本 sql 语句的判断条件被 or 短路成为了永远正确的语句。
    这里仅仅是举一个例子,事实上,sql 注入的方式还有很多种,这里不深入介绍了。

    总之,只要是通过用户输入数据来拼接 sql 语句,就必须在第一时间考虑如何避免 SQL 注入问题。

    那么,如何防止 SQL 注入呢?

    2. 预防 SQL 注入 – pymysql 参数化语句

    pymysql 的 execute 支持参数化 sql,通过占位符 %s 配合参数就可以实现 sql 注入问题的避免。

    import pymysql
    
    sql = 'SELECT count(*) as count FROM user WHERE id = %s AND password = %s'
    valus = [input['id'], input['password']]
    cursor = dbclient.cursor(pymysql.cursors.DictCursor)
    cursor.execute(sql, values)
    count = cursor.fetchone()
    if count is not None and count['count'] > 0:
     print('登陆成功')

    这样参数化的方式,让 mysql 通过预处理的方式避免了 sql 注入的存在。

    需要注意的是,不要因为参数是其他类型而换掉 %s,pymysql 的占位符并不是 python 的通用占位符。

    同时,也不要因为参数是 string 就在 %s 两边加引号,mysql 会自动去处理。

    3. 预防 SQL 注入 – mysql 存储过程

    数据库存储过程是 mysql 的一种高级用法,但是一般来说,并不建议使用数据库的存储过程。

    主要原因是:

    但是,虽然不建议使用存储过程,但是毕竟可以依赖他实现各种跨语言的 sql 注入预防,在复杂的场景下还是有其使用价值的。(以后需要用再去详细学,这里只作简单介绍)

    3.1. 存储过程编写

    delimiter \DROP PROCEDURE IF EXISTS proc_sql \CREATE PROCEDURE proc_sql (
     in nid1 INT,
     in nid2 INT,
     in callsql VARCHAR(255)
    )
    BEGIN
     set @nid1 = nid1;
     set @nid2 = nid2;
     set @callsql = callsql;
     PREPARE myprod FROM @callsql;
     -- PREPARE prod FROM 'select * from tb2 where nid>? and nid?'; 传入的值为字符串,?为占位符
     -- 用@p1,和@p2填充占位符
     EXECUTE myprod USING @nid1,@nid2;
     DEALLOCATE prepare myprod;
    
    END\delimiter ;

    3.2. pymsql 中调用

    import pymysql
    
    cursor = conn.cursor()
    mysql="SELECT * FROM user where nid > ? and nid  ?"
    cursor.callproc('proc_sql', args=(11, 15, mysql))
    rows = cursor.fetchall()
    conn.commit()

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • MySQL中无过滤条件的count详解
    • MySQL中int最大值深入讲解
    • Mysql主键和唯一键的区别点总结
    • 实例讲解MySQL中乐观锁和悲观锁
    • MySQL limit性能分析与优化
    • MySQL和Redis实现二级缓存的方法详解
    • Docker创建MySQL的讲解
    • PHP date()格式MySQL中插入datetime方法
    • mysql导出表的字段和相关属性的步骤方法
    • MySQL主从延迟现象及原理分析详解
    上一篇:SQL中过滤条件放on和where中的区别详解
    下一篇:关于sql注入的简要演示(入坑抛砖)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    pymysql如何解决sql注入问题深入讲解 pymysql,如何,解决,sql,注入,