• sql 注入风险


    sql 注入风险

    什么是sql注入呢?

    查看sql注入风险

    • 准备材料
    #创建一个用户表
    create table userinfo(id int primary key auto_increment,name char(12) unique not null,pwd int not null);
    #写入一个用户信息用于下面实验
    insert into userinfo(name,pwd) values('凯歌318',666);
    #表结构
    mysql> select * from userinfo;
    +------+-----------+------+
    | id   | name      | pwd  |
    +------+-----------+------+
    |    1 | 凯歌318   | 666  |
    +------+-----------+------+
    1 row in set (0.00 sec)
    
    • 示列 用户的登录模拟 select * from userinfo;查看数据库信息

    • select * from userinfo where name = '凯歌318' and pwd = 666; 正常情况下

    • select * from userinfo where name = '凯歌318';-- and pwd = '我就是密码';

    • 在sql语言中 -- 表示注释掉后边的语句,所以只要我们知道账户,就能得到想要的结果,这就是sql注入风险
    • 那你可能会想,还要知道账户才行,有没有不需要账户,就能得到想要的结果呢?
      • 当然有 select * from userinfo where name = '我不知道账号' or 1=1;-- and password = '我就是密码';

    • 这种情况也是sql的注入风险

    如何避免 sql 注入风险

     1.永远不要信任用户的输入。对用户的输入进行校验,能够通过正则表达式,或限制长度;对单引号和
    双"-"进行转换等。检查输入的数据是否具有所期望的数据格式,严格限制变量的类型,例如使用regexp包进行一些匹配处理,
    或者使用strconv包对字符串转化成其他基本类型的数据进行判断。
    
    2.永远不要使用动态拼装sql,能够使用參数化的sql或者直接使用存储过程进行数据查询存取。
    
    3.永远不要使用管理员权限的数据库连接,为每一个应用使用单独的权限有限的数据库连接。
    
    4.不要把机密信息直接存放。加密或者hash掉password和敏感的信息。对进入数据库的特殊字符('"尖括号&*;等)进行转义处理,
    或编码转换
    
    5.应用的异常信息应该给出尽可能少的提示,最好使用自己定义的错误信息对原始错误信息进行包装,避免网站打印出SQL错误信息,
    比如类型错误、字段不匹配等,把代码里的SQL语句暴露出来,以防止攻击者利用这些错误信息进行SQL注入。
    
    
    6.sql注入的检測方法一般採取辅助软件或站点平台来检測。软件一般採用sql注入检測工具jsky,站点平台就有亿思站点安全平台检測工具。
    MDCSOFT SCAN等。採用MDCSOFT-IPS能够有效的防御SQL注入。XSS攻击等。
    
    7.严格限制Web应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。
    
    8.在应用发布之前建议使用专业的SQL注入检测工具进行检测,以及时修补被发现的SQL注入漏洞。网上有很多这方面的开源工具,
    例如sqlmap、SQLninja等。
    
    9.所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,
    即不要直接拼接SQL语句。例如使用database/sql里面的查询函数Prepare和Query,或者Exec(query string, args ...interface{})。
    

    pymysql 简单规避注入风险示列

    #错误示范  不要自己去拼接账户和密码
    import pymysql
    conn = pymysql.connect(host='127.0.0.1', user='root', password='318', database='ftp')
    cur = conn.cursor()
    username = input('user >>>')
    password = input('passwd >>>')
    sql = "select * from userinfo where name = %s and password =  %s ;"% (username, password)
    cur.execute(sql)
    print(cur.fetchone())
    cur.close()
    conn.close()
    
    user >>>'我不知道账号' or 1=1;--
    passwd >>>我也不知道密码
    (1, '凯歌318', '666')
    Process finished with exit code 0
    
    
    #正确方法   cur.execute(sql, (username, password)) 把密码和账户交给 execute去拼接
    import pymysql
    conn = pymysql.connect(host='127.0.0.1', user='root', password='318', database='ftp')
    cur = conn.cursor()
    username = input('user >>>')
    password = input('pwd >>>')
    sql = "select * from userinfo where name = %s and pwd = %s"
    cur.execute(sql, (username, password))
    print(cur.fetchone())
    cur.close()
    conn.close()
    
    user >>>'我不知道账号' or 1=1;--
    pwd >>>也不知道密码
    None
    
    Process finished with exit code 0
    
    user >>>凯歌318
    pwd >>>666
    (1, '凯歌318', '666')
    Process finished with exit code 0
    
    作 者:郭楷丰
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角 推荐一下。您的鼓励是博主的最大动力!
    自 勉:生活,需要追求;梦想,需要坚持;生命,需要珍惜;但人生的路上,更需要坚强。带着感恩的心启程,学会爱,爱父母,爱自己,爱朋友,爱他人。
  • 相关阅读:
    iOS-数据存储的常用方式
    Bullet 学习笔记之 Bullet User Manual
    Bullet 学习笔记之 Bullet User Manual
    Bullet 学习笔记之 Bullet User Manual
    Bullet 学习笔记之 CollisionShape 和 CollisionObject
    Bullet Basic Example 示例
    Bullet 学习笔记
    Gazebo 机器人仿真流程之 World 类(二)
    Gazebo 机器人仿真流程之 WorldPrivate 类
    Gazebo 机器人仿真流程之 World 类
  • 原文地址:https://www.cnblogs.com/guokaifeng/p/11196452.html
Copyright © 2020-2023  润新知