为什么会产生sql注入:

  主要原因,对用户输入的绝对信任,相信所有用户的输入都是可信的,没有对用户输入的语句进行过滤或者筛选,直接放到sql语句中进行拼接,从而导致了sql注入的产生

  例如:

    <php?

      id = $_GET['id'];

      sql = "select * from tables where id=$id limit 0,1";

      .......

    ?>

  如果是正常的id等于数值之类,是没有问题的,但是id如果被恶意用户更改,我们原本的逻辑就会出现一系列的问题

  假如恶意用户输入的是 -1 union select version(),database()--+;

  直接将用户输入的id拼接上就会产生以下语句

  sql = "select * from tables where id=-1 union select version(),database()-- limit 0,1"(--表示的是数据库注释,+表示字符串的拼接)

  由于他将id设置为了-1,数据库中不存在负值的id,所以第一个查询会查询到一个空的表,这样数据库会将union联合查询查询到的sql结果,返回出来

  这样,恶意用户就会拿到我们数据库的版本和数据库的名字,要知道,在mysql5.0以上会存在一个information_schrma的数据库,这个数据库存放着所有的数据库名,表名,字段名,我们所有数据就会被泄露,严重的,还能对我们的数据进行修改和删除(堆叠查询,将原来的sql闭合,这样就可以直接对数据库进行危险操作 比如 insert drop  有的数据库或者中间件是不支持堆叠查询,具体堆叠查询(注入)就不再细说了)

sql注入的预防:

  sql注入的本质上还是对用户输入数据的绝对信任,当我们对用户输入的数据绝对不信任的时候,就可以预防sql注入

  1.输入数据长度的限制

  2.关键字过滤:

    对每个参数的传递进行检测,对其进行sql关键字过滤如(select insert where)          建议采用正则检测和递归过滤

  3.对参数携带的特殊字符进行转义和过滤:
    因为好多注入点都是在字符位置发生的,如果需要进行sql注入,就要先进性闭合的符号判断(id='$id' 如果不进行引号的闭合,数据库就会认为用户输入的所有参数为同一个字符串,这样sql注入的参数就会被认为是无效的)这也是我们的防护手段之一                建议采用正则检测和递归过滤

  4.预编译防注入:预编译防注入是目前最好的,最有效的防注入手段
    在数据库进行预编译的之后,sql语句已经会被数据库编译和优化了,并且运行数据库以参数化的形式进行查询,即使传递来的敏感字符也不会被执行,而是被当作参数处理

  5.不要直接显示出错误的原因,最好指定一个错误的页面,尤其是sql注入(即使存在注入,也要让他去盲注)

关键字过滤&参数过滤:

pdo预编译代码:

sql注入的原理是什么,怎么预防sql注入的更多相关文章

  1. SQL注入的原理与预防

    1. 什么是SQL注入? SQL注入是常见的网络攻击方式之一,通过SQL语句实现无账号登录,非法获取甚至篡改数据库中的数据. 2. SQL注入的思路 (1)找到SQL注入位置: (2)判断服务器类型和 ...

  2. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  3. DEDECMS数据库执行原理、CMS代码层SQL注入防御思路

    我们在上一篇文章中学习了DEDECMS的模板标签.模板解析原理,以及通过对模板核心类的Hook Patch来对模板的解析流量的攻击模式检测,达到修复模板类代码执行漏洞的目的 http://www.cn ...

  4. 怎么预防sql注入攻击

    假设sql是搜索用户A的文章,sql会是这样: select * from table where owner='A'; sql注入攻击者会修改用户名来实现攻击,例如把A 改成A' or 1='1 组 ...

  5. 【渗透课程】第五篇-SQL注入的原理

    哈哈哈,讲到注入了.我想给大家讲注入的原理.这个我们前面的前言篇就说过,所谓的SQL注入就是,绕过数据库验证机制直接执行SQL语句.怎么说呢,我们先讲一个概念吧! 网站和网页的区别 单纯的网页是静态的 ...

  6. Sql注入基础原理介绍

    说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...

  7. sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)

    (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...

  8. 利用PreparedStatement预防SQL注入

    1.什么是sql注入 SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为. 例如登录用户名采用  ' or 1=1 or username=‘,后台数据查询语句就变成 ...

  9. 预防SQL注入攻击

    /** * 预防SQL注入攻击 * @param string $value * @return string */ function check_input($value) { // 去除斜杠 if ...

随机推荐

  1. pycharm out of memory 闪退

    不知道从什么时候开始,python开始报 out of memory. 把pycharm64.exe.vmoptions -Xmx 调成1024m或者2048m pycharm就打不开了 低了不能用, ...

  2. NFS部署

    yum install nfs-utils -y systemctl restart/enable nfs systemctl status rpcbind vim /etc/exports /dat ...

  3. ng-做一个简单的通讯录--学习使用路由和HTTP

    app.module import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@ang ...

  4. CF1093E Intersection of Permutations [分块 +bitset]

    大家好, 我非常喜欢暴力数据结构, 于是就用分块A了此题 分块题,考虑前缀和 \(b_i\) 表示 bitset 即 \(0\) ~ $i $ 出现过的数字,然后考虑直接暴力复制块然后前缀和,修改也很 ...

  5. Java中异步注解@Async的陷阱

    或许,你在Java后端添加异步过程时会这样处理,然后摇摇大摆.灰溜溜地闪,而实际的运行结果却并不是我们期望的那样.那么,现在就将试验结果记录如下,以便少走弯路. (一)在Controller层的公开接 ...

  6. .net mvc接收参数为null的解决方案

    1.通过对象接收请求数据时的null 必须为对象的属性设置get与set private System.String _EMail = System.String.Empty; public Syst ...

  7. kali2019.4试用记录

    问题一:中文乱码 https://blog.csdn.net/dust_hk/article/details/103299136 参考以上博文即可解决: 1.设置locales. dpkg-recon ...

  8. Bootstrap4一些零散的知识点

    ·Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局.移动设备优先的 WEB 项目. Bootstrap4 目前是 Bootstrap 的最新版本,是一套用于 HTML.CSS 和 J ...

  9. PHP常见数组函数总结

    一.数组的一些关于键名和值的基础操作函数 1.获取数组所有的键或值:array_keys() array_values() $arr_keys = array_keys($array); $arr_v ...

  10. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...