关于SQL注入和如何防止
之前在笔试的时候没有很好的答出这个问题,因此我要总结一下问题,以免日后继续在这个地方跌倒,以下是自己的理解,如有错误请指出
一.什么是SQL注入
SQL注入就是服务器在根据业务去处理数据库的时候,客户端传来的参数里面含有一些非法的SQL语句或者特殊符号,导致原来该执行的SQL语句变成了另一个SQL语句。
最经典的案例就是用户登录页面,前端有一个登陆的表单,可以填写账号,密码,用户在填写密码点击登录之后就会把信息传给服务器。
然后服务器会执行类似于下面的语句
$userName = $_POST['userName'];
$password= $_POST['password'];
$res = mysql_query("SELECT * FROM user where name='{$userName}' && password='{$password}'; ");
if(mysql_fetch_assoc($res)){
eho "登录成功";
}else{
echo "账号不存在或者密码错误";
}
试想一下,如果有不法分子在账号一栏输入 'or 1=1;-- 那里SQL语句从原来程序员期盼的
SELECT * FROM `user` WHERE username='username' && `password`='password';
变成了
SELECT * FROM `user` WHERE username=''or 1=1;--' && `password`='123';
这样就列出了全部的用户的信息,而且顺利登陆了客户端在不输入任何的账号和密码信息。其实这个还算好的了,如果输入的是 ';drop table user;-- 这样就直接把你的用户表给删了。
二.如何防范SQL注入
其实明白了原理就解决起来就会很简单,最有效的方法就是让传来的数据参数化,何为参数化?就是把传来的数据真真正正的作为参数,而不会成为SQL语句的一部分,比如说刚刚传来的数据里面用户名为'or 1=1;-- SQL语句就真的要去查询是否有一个用户名字名为 'or 1=1;-- 而不会变成另一个SQL语句,要实现的话只需要把SQL语句预先编译,然后再把参数传过去SQL语句,这样就算数据非法也无济于事,因为真的不会把数据真的作为语句来执行。
那么该如何实现参数化查询呢?
在MySql参数化查询,首先是预定义一个SQL语句,然后我们再定义参数,最后调用预定义的带上参数的SQL即可
预定义SQL语句在MySql是用prepare来预定义,其中我们用?代表在预定的SQL语句里面的参数。
prepare pre_name from "SQL语句";
执行就是如下:
excute pre_name [using 参数1,参数2];
下面是一个正确查询账号密码的MySql例子:
SET @name="userName"; --定义参数
SET @password="password"; --定义参数
PREPARE test FROM "SELECT * FROM user WHERE username=? && password=?"; --用prepare预定义SQL语句,?代表参数
EXECUTE test USING @name,@password; --执行SQL语句,并把对应参数传过去
这时候测试一下如果传来的参数是'or 1=1;-- 执行结果也只是查询用户名为'or 1=1;--的用户
三.其他防范SQL注入的办法
至于其他办法嘛,也有很多,下面是从网上资料查阅之后总结起来还算靠谱的一些。当然我个人感觉还是查询参数化最有效。
1.对传来的数据中的特殊字符进行转义,如十六进制字符,斜杠,双引号,单引号,注释等等。
2.尽量对不要用最高权限的SQL账户去操作数据库,而是分配不同的权限给不同的用户,在需要操作数据的场合分配对应权限的用户。
3.使用存储过程,其实和查询参数化一个道理,由于存储过程的SQL语句已经预编译过了,因此不用担心数据作为SQL语句的一部分。
4.减少SQL执行反馈信息,或者说把反馈信息改成自己的一套提示码,尽量不让对方知道自己的数据库信息。
关于SQL注入和如何防止的更多相关文章
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 揭开SQL注入的神秘面纱PPT分享
SQL注入是一个老生常谈但又经常会出现的问题.该课程是我在公司内部培训的课程,现在分享出来,希望对大家有帮助. 点击这里下载.
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- jdbc java数据库连接 8)防止sql注入
回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象; 写sql 5:执行sql ...
- Entity Framework关于SQL注入安全问题
1.EF生成的sql语句,用 parameter 进行传值,所以不会有sql注入问题 2.EF下有涉及外部输入参数传值的,禁止使用EF直接执行sql命令方式,使用实体 SQL 参考: https: ...
- Java防止SQL注入2(通过filter过滤器功能进行拦截)
首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...
随机推荐
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- jquery对单选和下拉框的操作
jquery 对表单的操作: 对单选框的操作: 一.对单选框的操作: 1.$('input
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
- 深入理解javascript函数参数与闭包(一)
在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...
- 解决mysql卸载后无法从新安装,卡在最后一步的问题
mysql服务出现问题往往是最麻烦的,往往需要重装,而重装很多人卸不干净残留文件,更加装不上.在下就遇到这个问题.重装mysql到最后一步时卡在了最后一步的第二条上 解决办法就是卸载后删注册表+删数据 ...
- LDAP注入与防御解析
[目录] 0x1 LDAP介绍 0x2 LDAP注入攻击及防御 0x3 参考资料 0x1 LDAP介绍 1 LDAP出现的背景 LDAP(Lightweight Directory Access Pr ...
- UICollectionViewCell--查找cell上的按钮点击后,对应的是哪个cell
实际写项目会碰到各种各样的问题,废话不多说 按钮添加到cell时,根据是直接添加到self还是self.contentView上,在点击方法里找到btn的父视图 我是直接添加到self上,所以只有一层 ...
- DXGI 1.4的新特性
其实到写这篇文章的时候,DXGI已经出1.5版了,但很多朋友实际上还在用1.2甚至1.1,所以现在谈1.4一点也不过时,而且1.4又是一次非常重大的更新,很值得仔细谈谈. 为了支持Direct3D 1 ...
- installshield使用教程
从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而让大家去安装使用第三方的打包工具“InstallShield Limited Edition for Vis ...
- 分享一下Java写的坦克大战游戏,相信很多人小时候玩过
写在前面 程序是五六年前读书的时候写的,里面会有一些不规范的,我已经将代码传到github上了,有时间会优化修改. 程序运行机制 定义了一个JPanel,然后每隔一小段时间重绘一遍. 重绘的内容如下: ...