java sql注入 正则表达式_Java防止SQL注入(转)
一、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注入(转)相关推荐
- java 中的正则表达式_Java中的正则表达式–软介绍
java 中的正则表达式 正则表达式是一种可以应用于文本(Java中的String)的模式. Java提供了java.util.regex包,用于与正则表达式进行模式匹配. Java正则表达式与Per ...
- java开发中推荐的防御sql注入方法_Java防止SQL注入
SQL 注入简介: SQL注入是最常见的攻击方式之一,它不是利用操作系统或其它系统的漏洞来实现攻击的,而是程序员因为没有做好判断,被不法用户钻了SQL的空子,下面我们先来看下什么是SQL注入: 比如在 ...
- java sql注入正则表达式_php防止sql注入示例分析和几种常见攻击正则表达式
注入漏洞代码和分析 function customError($errno, $errstr, $errfile, $errline) { echo "Error number: [$err ...
- java防sql注入 策略_java防止sql注入
public final static String filterSQLInjection(String s) { if (s == null || "".equals(s)) { ...
- java sql 字符串 转义_java拼接SQL语句的特殊字符转义
在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询. 如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入. ...
- java中sql语句换行_java中sql语句快速处理
在java开发中,有时候经常需要写很长的sql,需要用双引号括起来,然后换行啥的.虽然手动可以自己写,但经常浪费时间,而且容易写错.自己写了个小工具,自动处理.先看效果吧 比如这么一长串sql: SE ...
- java中的sql语句书写_Java中sql语句之通配符*
在java中执行SQL语句要特别注意通配符的问题,否则是不会成功的: 在ACCESS中的通配符是* 例:select * from student where name like '张*' ...
- java调用MySQL脚本_Java调用SQL脚本执行常用的方法示例
前言 大家都知道,在Java中调用SQL脚本的方式有多种,在这里只记录一种自己常用的方式,个人觉得挺实用方便的. 运用ScriptRunner这个类. ScriptRunner类用于执行SQL语句,例 ...
- java中sql查询语句_JAVA中用 SQL语句操作小结
1.添加记录(INSERT) 使用SQL语句的INSERT命令可以向数据库中插入记录,INSERT命令的基本形式为: INSERT INTO 表名 [(字段名1,字段名2-)] VALUES (值1, ...
最新文章
- Python培训分享:Python内置标准异常及其解析
- c语言输出最后不带空格,新人提问:如何将输出时每行最后一个空格删除
- 使用lucce分词怎么_深度学习时代,分词真的有必要吗
- wifi 2.4g 5g 区别_wifi信号差,网速慢?可能是你没有配置好2.4G和5G WiFi
- 关于类黄酮和类胡萝卜素
- 开源纯C#工控网关+组态软件(五)从网关到人机界面
- CVPR2020| 最新CVPR2020论文抢先看,附全部下载链接!
- Python基础学习总结、学习展望
- WWW'22 | 信息检索方向值得一读的3篇论文详解
- 【优化预测】基于matlab萤火虫算法优化BP神经网络预测【含Matlab源码 1313期】
- deepin启动盘无法引导安装_通过Deepin系统的安装U盘来修复启动引导:可解决大部分启动引导问题...
- 单片机学习笔记-基础知识
- html手机陀螺仪,陀螺仪MEMS - 详解冷门但很重要的手机陀螺仪
- 微信小程序运营案例(一)—— XXX商贸冷冻食品配送中心
- Word设置默认粘贴格式,自动更改粘贴格式
- git基础之切换分支
- Unity安卓打包设置项目名称为中文名
- Micropython开发之TPYBoard制作声光控开关教程实例
- linux命令kill9的含义,[整理]kill -9的含义
- 最好的HTML 5编码教程和参考手册分享