安全架构-SQL注入原理及防范
安全架构系列文章
SQL注入原理及防范
文章目录
- 安全架构系列文章
- 前言
- 一、sql注入是什么?
- 二、防范方法
- 1.Java处理
- 2 .NET处理
- 总结
前言
一、sql注入是什么?
SQL注入是通过客户端的输入把SQL命令注入到一个应用的数据库中,从而执行恶意的SQL语句。
*
什么意思呢?我们来打个比方:我们有一个登录框,需要输入用户名和密码对吧,然后我们的密码输入 'or ‘123’ = '123 这样的。
我们在查询用户名和密码是否正确的时候,本来执行的sql语句是:select * from user where username = ‘’
and password = ‘’. 这样的sql语句,现在我们输入密码是如上这样的,然后我们会通过参数进行拼接,拼接后的sql语句就是:
select * from user where username = ‘’ and password = ’ ’ or ‘123’ =
‘123 ‘; 这样的了,那么会有一个or语句,只要这两个有一个是正确的话,就条件成立,因此 123 = 123
是成立的。因此验证就会被跳过。这只是一个简单的列子,比如还有密码比如是这样的:’; drop table user;,
这样的话,那么sql命令就变成了: select * from user where username = ‘’ and password
= ‘’; drop table user;’ , 那么这个时候我们会把user表直接删除了。
sql被攻击的原因是:sql语句伪造参数,然后对参数进行拼接后形成xss攻击的sql语句。最后会导致数据库被攻击了。
二、防范方法
- 我们可以使用预编译语句(PreparedStatement,这样的话即使我们使用sql语句伪造成参数,到了服务端的时候,这个伪造sql语句的参数也只是简单的字符,并不能起到攻击的作用。
- 数据库中密码不应明文存储的,可以对密码使用md5进行加密,为了加大破解成本,所以可以采用加盐的方式。
1.Java处理
1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username="111", 如果传入的值是id,则解析成的sql为where username="id".
2、$将传入的数据直接显示生成在sql中。
如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
4、$方式一般用于传入数据库对象,例如传入表名.
5、一般能用#的就别用$,若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
6、在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。
在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
2 .NET处理
使用SqlParameter,不要直接拼接参数到sql字符串中
public UserInfoModel Login(UserInfoModel model)7 {8 UserInfoModel userInfoModel = null;9 string sql = @"select UserName, Password from UserInfos
10 where UserName=@UserName and Password=@Password";
11 SqlParameter[] paras =
12 {13 new SqlParameter("@UserName",model.UserName),
14 new SqlParameter("@Password",model.Password)
15 };
16 DataRow row = DBHelper.GetDataRow(sql, paras);
17 if (row != null)
18 {19 userInfoModel = new UserInfoModel();
20 userInfoModel.UserName = row["UserName"].ToString();
21 userInfoModel.Password = row["Password"].ToString();
22 }
23 return userInfoModel;//true false
24 }
总结
使用各语言的sql预编译处理功能,即可很好的防范SQL注入,我们需要有sql注入攻击的意识,不要手动写字符串拼接sql进行执行。否则,后果很严重。
安全架构-SQL注入原理及防范相关推荐
- SQL注入原理及防范
SQL注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户 ...
- sql注入原理及防范方式
前言 sql注入是一种危险系数较高的攻击方式,现在由于我们持久层框架越来越多,大部分框架会处理这个问题,因此导致我们对它的关注度越来越少了.最近部门在整理安全漏洞时,提到了一些关于sql注入的修改点, ...
- SQL注入原理及过程简单介绍
1.产生SQL注入原因 开发代码的时候没有全面考虑到网络安全性,特别是在用户交互时,没有考虑到用户提交的信息中可能破坏数据库,没有对输入的数据进行合法的过滤.SQL 注入过程目的性是非常 ...
- SQL注入原理及如何判断闭合符
一.SQL注入原理: 造成SQL注入的原因: 在没有对用户的输入进行过滤.检测的情况下,就把用户输入数据,带入到数据库中执行SQL语句. 利用SQL注入: 由于系统没有对输入的数据进行过滤.检测,就带 ...
- SQL注入攻击及其防范检测技术研究
2008-12-18 来自:51CTO 作者:陈小兵 本文简要介绍了SQL注入攻击的原理,SQL注入攻击实现过程,并在此基础上给出了一种SQL注入攻击的自动防范模型. 1 SQL注入攻击概述 1 ...
- sql注入原理及解决方案
sql注入原理及解决方案 参考文章: (1)sql注入原理及解决方案 (2)https://www.cnblogs.com/huzi007/p/6370732.html 备忘一下.
- Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解
前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...
- sql注入***原理
sql注入***原理: 是数据库的安全漏洞.网站服务器端语言自身的缺陷以及程序设计过程中,对安全方面,考虑不足或者是不全面导致对输入字符串中夹带的sql指令的检查,从而是数据库受到***,包括数据库的 ...
- mysql 绕过select报错_Web安全之SQL注入(原理,绕过,防御)
首先了解下Mysql表结构 mysql内置的information_schema数据库中有三个表非常重要 1 schemata:表里包含所有数据库的名字 2 tables:表里包含所有数据库的所有的表 ...
最新文章
- 聊聊 SpringCloud 中的父子容器
- 详解linux系列之sendmail邮箱服务的安装及配置
- centos后台登录ftp_「vscode remote ssh 免登录」mac
- 部署OCS后修改web farm地址
- 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)
- 牛客题霸 [数组中只出现一次的数字] C++题解/答案
- 使用Spring Boot和Vue进行有益的开发
- Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...
- SQL语句更改数据库名,表名,列名
- 杭电acm阶段之理工大版
- 嗯嗯------摘抄
- dedecms采集经验
- token实现单点登录原理
- 使用python语解决一个小学数学题----鸡兔同笼问题
- C# ActionT 委托
- 程序员幽默:当程序员当了爸爸
- hbase java api样例(版本1.3.1,新API)
- mysql汉字拼音缩写查询
- 使用CSS把Div放在屏幕中间。
- 移动安全-BTS-Potentially Harmful Applications (PHAs)