• 预防sql注入


    前言:

    这两天做项目的时候发现很多小地方没有注意js或者sql注入,平时登录都是md5加密,今天突然发现记录一下。

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令

    过程:

    类似这种很简单的页面 ,可能sql语句写法都如下:

    select* form table where title ='活动' 

    但是懂点sql的人 ,可以输入' or ''=',

    select* form table where title ='' or ''='' 

    或者 ' or 1=1-- (后加一个空格)

    select* form table where title ='' or 1=1-- ' (注释掉后面的单引号)

    加上传入参数默认的两个包裹单引号,sql被解析了成了一个恒等式

    于是结果如下,查询出了所有数据

    升级:借助异常获取信息

    破解表名:

    and (select count(*) from 表名)<>0       (不等于0,判断是否正确)

    破解列名:

    and (select count(列名) from 表名)<>0

    返回正确的,那么写的表名或列名就是正确

    预防:

    1.对用户的输入进行校验,可以通过正则表达式,对单引号和双"-"进行转换,控制数据类型等。
    2.不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取
     
            String sql = "select id, no from user where id=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, id);
            ps.executeQuery();

    采用sql语句预编译和绑定变量,是防御sql注入的最佳方法  

    PreparedStatement,就会将sql语句:"select id, no from user where id=?" 预先编译好,也就是SQL引擎会预先进行语法分析产生语法树生成执行计划

    也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的 语法结构

    3.md5加密
    4.不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
    5.自定义错误信息对原始错误信息进行包装
    6.辅助检验工具

     

  • 相关阅读:
    程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美
    微前端大赏
    【老李瞎折腾】001、折腾一下DDNS
    【老李瞎折腾】000、使用树莓派搭建自己的服务器
    【老李瞎折腾】目录
    RGB打水印在YUV图片上
    BMP格式解析
    测试开发不会前端?ElementUI你需要了解一下
    如何通过命令行运行Postman脚本2020-09-15
    长点心吧!测试老鸟教你如何避免背锅
  • 原文地址:https://www.cnblogs.com/coderL/p/7782684.html
Copyright © 2020-2023  润新知