一、SQL注入简介

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

二、SQL注入攻击的总体思路

1.寻找到SQL注入的位置

2.判断服务器类型和后台数据库类型

3.针对不通的服务器和数据库特点进行SQL注入攻击

三、SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名:‘or 1 = 1 –

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢?下面我们分析一下

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username='’or 1 = 1 -- and password='’

分析SQL语句:

条件后面username=”or 1=1用户名等于”或1=1那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''

….其后果可想而知…

四、应对方法

下面我针对JSP,说一下应对方法:

1.(简单又有效的方法)PreparedStatement

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.

原理:

sql注入只对sql语句的准备(编译)过程有破坏作用

而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

要引入的包:

import java.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

典型的SQL注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’)

检测MS SQL Server SQL注入攻击的正则表达式:/exec(\s|\+)+(s|x)p\w+/ix

等等…..

3.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

public static booleansql_inj(String str)

{

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

String inj_stra[] = split(inj_str,"|");

for(inti=0 ; i < inj_stra.length ; i++ )

{

if(str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

4.jsp中调用该函数检查是否包函非法字符

防止SQL从URL注入:

sql_inj.java代码:

packagesql_inj;

importjava.net.*;

importjava.io.*;

importjava.sql.*;

importjava.text.*;

importjava.lang.String;

public classsql_inj{

public static booleansql_inj(String str)

{

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

//这里的东西还可以自己添加

String[] inj_stra=inj_str.split("\\|");

for(inti=0 ; i < inj_stra.length ; i++ )

{

if(str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

}

5.JSP页面判断代码:

使用javascript在客户端进行不安全字符屏蔽

功能介绍:检查是否含有”‘”,”\\”,”/”

参数说明:要检查的字符串

返回值:0:是1:不是

函数名是

function check(a)

{

return1;

fibdn =newArray (”‘” ,”\\”,”/”);

i=fibdn.length;

j=a.length;

for(ii=0; ii<i; ii++)

{for(jj=0; jj<j; jj++)

{ temp1=a.charAt(jj);

temp2=fibdn[ii];

if(tem’; p1==temp2)

{return0; }

}

}

return1;

}

总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。

凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。

java sql注入 正则表达式_Java防止SQL注入(转)相关推荐

  1. java 中的正则表达式_Java中的正则表达式–软介绍

    java 中的正则表达式 正则表达式是一种可以应用于文本(Java中的String)的模式. Java提供了java.util.regex包,用于与正则表达式进行模式匹配. Java正则表达式与Per ...

  2. java开发中推荐的防御sql注入方法_Java防止SQL注入

    SQL 注入简介: SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面我们先来看下什么是SQL注入: 比如在 ...

  3. java sql注入正则表达式_php防止sql注入示例分析和几种常见攻击正则表达式

    注入漏洞代码和分析 function customError($errno, $errstr, $errfile, $errline) { echo "Error number: [$err ...

  4. java防sql注入 策略_java防止sql注入

    public final static String filterSQLInjection(String s) { if (s == null || "".equals(s)) { ...

  5. java sql 字符串 转义_java拼接SQL语句的特殊字符转义

    在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询. 如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入. ...

  6. java中sql语句换行_java中sql语句快速处理

    在java开发中,有时候经常需要写很长的sql,需要用双引号括起来,然后换行啥的.虽然手动可以自己写,但经常浪费时间,而且容易写错.自己写了个小工具,自动处理.先看效果吧 比如这么一长串sql: SE ...

  7. java中的sql语句书写_Java中sql语句之通配符*

    在java中执行SQL语句要特别注意通配符的问题,否则是不会成功的: 在ACCESS中的通配符是* 例:select  *  from student  where  name like  '张*' ...

  8. java调用MySQL脚本_Java调用SQL脚本执行常用的方法示例

    前言 大家都知道,在Java中调用SQL脚本的方式有多种,在这里只记录一种自己常用的方式,个人觉得挺实用方便的. 运用ScriptRunner这个类. ScriptRunner类用于执行SQL语句,例 ...

  9. java中sql查询语句_JAVA中用 SQL语句操作小结

    1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1, ...

最新文章

  1. Python培训分享:Python内置标准异常及其解析
  2. c语言输出最后不带空格,新人提问:如何将输出时每行最后一个空格删除
  3. 使用lucce分词怎么_深度学习时代,分词真的有必要吗
  4. wifi 2.4g 5g 区别_wifi信号差,网速慢?可能是你没有配置好2.4G和5G WiFi
  5. 关于类黄酮和类胡萝卜素
  6. 开源纯C#工控网关+组态软件(五)从网关到人机界面
  7. CVPR2020| 最新CVPR2020论文抢先看,附全部下载链接!
  8. Python基础学习总结、学习展望
  9. WWW'22 | 信息检索方向值得一读的3篇论文详解
  10. 【优化预测】基于matlab萤火虫算法优化BP神经网络预测【含Matlab源码 1313期】
  11. deepin启动盘无法引导安装_通过Deepin系统的安装U盘来修复启动引导:可解决大部分启动引导问题...
  12. 单片机学习笔记-基础知识
  13. html手机陀螺仪,陀螺仪MEMS - 详解冷门但很重要的手机陀螺仪
  14. 微信小程序运营案例(一)—— XXX商贸冷冻食品配送中心
  15. Word设置默认粘贴格式,自动更改粘贴格式
  16. git基础之切换分支
  17. Unity安卓打包设置项目名称为中文名
  18. Micropython开发之TPYBoard制作声光控开关教程实例
  19. linux命令kill9的含义,[整理]kill -9的含义
  20. 最好的HTML 5编码教程和参考手册分享

热门文章

  1. 银河麒麟桌面V10挂载外接光驱光盘
  2. PR曲线和ROC曲线
  3. CSDN 5月付费专栏销量榜Top10
  4. 纸质实验记录本难合规,ELN电子实验记录本是必备
  5. 英语简明语法系列之---代词(二)
  6. AD域服务器搭建 (图文详解)
  7. air什么意思中文_air
  8. POJ 1418 Viva Confetti 题解 《挑战程序设计竞赛》
  9. Fizz Buzz in Tensorflow-一场奇怪的面试(译)笑死宝宝啦哈哈哈
  10. Python3 Request+Redis 爬取BILIBILI番剧列表