安全架构系列文章

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语句。最后会导致数据库被攻击了。

二、防范方法

  1. 我们可以使用预编译语句(PreparedStatement,这样的话即使我们使用sql语句伪造成参数,到了服务端的时候,这个伪造sql语句的参数也只是简单的字符,并不能起到攻击的作用。
  2. 数据库中密码不应明文存储的,可以对密码使用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注入原理及防范相关推荐

  1. SQL注入原理及防范

    SQL注入原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户 ...

  2. sql注入原理及防范方式

    前言 sql注入是一种危险系数较高的攻击方式,现在由于我们持久层框架越来越多,大部分框架会处理这个问题,因此导致我们对它的关注度越来越少了.最近部门在整理安全漏洞时,提到了一些关于sql注入的修改点, ...

  3. SQL注入原理及过程简单介绍

    1.产生SQL注入原因        开发代码的时候没有全面考虑到网络安全性,特别是在用户交互时,没有考虑到用户提交的信息中可能破坏数据库,没有对输入的数据进行合法的过滤.SQL 注入过程目的性是非常 ...

  4. SQL注入原理及如何判断闭合符

    一.SQL注入原理: 造成SQL注入的原因: 在没有对用户的输入进行过滤.检测的情况下,就把用户输入数据,带入到数据库中执行SQL语句. 利用SQL注入: 由于系统没有对输入的数据进行过滤.检测,就带 ...

  5. SQL注入攻击及其防范检测技术研究

    2008-12-18  来自:51CTO  作者:陈小兵 本文简要介绍了SQL注入攻击的原理,SQL注入攻击实现过程,并在此基础上给出了一种SQL注入攻击的自动防范模型. 1  SQL注入攻击概述 1 ...

  6. sql注入原理及解决方案

    sql注入原理及解决方案 参考文章: (1)sql注入原理及解决方案 (2)https://www.cnblogs.com/huzi007/p/6370732.html 备忘一下.

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

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

  8. sql注入***原理

    sql注入***原理: 是数据库的安全漏洞.网站服务器端语言自身的缺陷以及程序设计过程中,对安全方面,考虑不足或者是不全面导致对输入字符串中夹带的sql指令的检查,从而是数据库受到***,包括数据库的 ...

  9. mysql 绕过select报错_Web安全之SQL注入(原理,绕过,防御)

    首先了解下Mysql表结构 mysql内置的information_schema数据库中有三个表非常重要 1 schemata:表里包含所有数据库的名字 2 tables:表里包含所有数据库的所有的表 ...

最新文章

  1. 聊聊 SpringCloud 中的父子容器
  2. 详解linux系列之sendmail邮箱服务的安装及配置
  3. centos后台登录ftp_「vscode remote ssh 免登录」mac
  4. 部署OCS后修改web farm地址
  5. 【招聘(上海)】 坚果云 招聘Windows客户端(WPF方向)
  6. 牛客题霸 [数组中只出现一次的数字] C++题解/答案
  7. 使用Spring Boot和Vue进行有益的开发
  8. Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...
  9. SQL语句更改数据库名,表名,列名
  10. 杭电acm阶段之理工大版
  11. 嗯嗯------摘抄
  12. dedecms采集经验
  13. token实现单点登录原理
  14. 使用python语解决一个小学数学题----鸡兔同笼问题
  15. C# ActionT 委托
  16. 程序员幽默:当程序员当了爸爸
  17. hbase java api样例(版本1.3.1,新API)
  18. mysql汉字拼音缩写查询
  19. 使用CSS把Div放在屏幕中间。
  20. 移动安全-BTS-Potentially Harmful Applications (PHAs)

热门文章

  1. Goland最新服务器激活
  2. cesium加载自定义mapbox地图
  3. jquery对元素隐藏的操作
  4. 手机短信删除了怎么恢复
  5. 关于java金钱换算问题所作的一次笔记
  6. js 银行卡正则校验
  7. LeetCode第688题 骑士在棋盘上的概率
  8. 【最新计算机毕业设计】JAVA基于微信小程序的英语学习激励系统
  9. 史上最经典垃圾回收器(CMS,G1)详解、适用场景及特点、使用命令
  10. 移动端h5丶小程序自定义凹陷tabbar中间悬浮按钮思路分享