sql注入的原理是什么,怎么预防sql注入
为什么会产生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注入的更多相关文章
- SQL注入的原理与预防
1. 什么是SQL注入? SQL注入是常见的网络攻击方式之一,通过SQL语句实现无账号登录,非法获取甚至篡改数据库中的数据. 2. SQL注入的思路 (1)找到SQL注入位置: (2)判断服务器类型和 ...
- Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...
- DEDECMS数据库执行原理、CMS代码层SQL注入防御思路
我们在上一篇文章中学习了DEDECMS的模板标签.模板解析原理,以及通过对模板核心类的Hook Patch来对模板的解析流量的攻击模式检测,达到修复模板类代码执行漏洞的目的 http://www.cn ...
- 怎么预防sql注入攻击
假设sql是搜索用户A的文章,sql会是这样: select * from table where owner='A'; sql注入攻击者会修改用户名来实现攻击,例如把A 改成A' or 1='1 组 ...
- 【渗透课程】第五篇-SQL注入的原理
哈哈哈,讲到注入了.我想给大家讲注入的原理.这个我们前面的前言篇就说过,所谓的SQL注入就是,绕过数据库验证机制直接执行SQL语句.怎么说呢,我们先讲一个概念吧! 网站和网页的区别 单纯的网页是静态的 ...
- Sql注入基础原理介绍
说明:文章所有内容均截选自实验楼教程[Sql注入基础原理介绍]~ 实验原理 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击, ...
- sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)
(整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...
- 利用PreparedStatement预防SQL注入
1.什么是sql注入 SQL 注入是用户利用某些系统没有对输入数据进行充分的检查,从而进行恶意破坏的行为. 例如登录用户名采用 ' or 1=1 or username=‘,后台数据查询语句就变成 ...
- 预防SQL注入攻击
/** * 预防SQL注入攻击 * @param string $value * @return string */ function check_input($value) { // 去除斜杠 if ...
随机推荐
- pycharm out of memory 闪退
不知道从什么时候开始,python开始报 out of memory. 把pycharm64.exe.vmoptions -Xmx 调成1024m或者2048m pycharm就打不开了 低了不能用, ...
- NFS部署
yum install nfs-utils -y systemctl restart/enable nfs systemctl status rpcbind vim /etc/exports /dat ...
- ng-做一个简单的通讯录--学习使用路由和HTTP
app.module import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@ang ...
- CF1093E Intersection of Permutations [分块 +bitset]
大家好, 我非常喜欢暴力数据结构, 于是就用分块A了此题 分块题,考虑前缀和 \(b_i\) 表示 bitset 即 \(0\) ~ $i $ 出现过的数字,然后考虑直接暴力复制块然后前缀和,修改也很 ...
- Java中异步注解@Async的陷阱
或许,你在Java后端添加异步过程时会这样处理,然后摇摇大摆.灰溜溜地闪,而实际的运行结果却并不是我们期望的那样.那么,现在就将试验结果记录如下,以便少走弯路. (一)在Controller层的公开接 ...
- .net mvc接收参数为null的解决方案
1.通过对象接收请求数据时的null 必须为对象的属性设置get与set private System.String _EMail = System.String.Empty; public Syst ...
- kali2019.4试用记录
问题一:中文乱码 https://blog.csdn.net/dust_hk/article/details/103299136 参考以上博文即可解决: 1.设置locales. dpkg-recon ...
- Bootstrap4一些零散的知识点
·Bootstrap 是全球最受欢迎的前端组件库,用于开发响应式布局.移动设备优先的 WEB 项目. Bootstrap4 目前是 Bootstrap 的最新版本,是一套用于 HTML.CSS 和 J ...
- PHP常见数组函数总结
一.数组的一些关于键名和值的基础操作函数 1.获取数组所有的键或值:array_keys() array_values() $arr_keys = array_keys($array); $arr_v ...
- 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容
一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...