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 boolean sql_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 (int i=0 ; i < inj_stra.length ; i++ )
- {
- if (str.indexOf(inj_stra[i])>=0)
- {
- return true;
- }
- }
- return false;
- }
4.jsp中调用该函数检查是否包函非法字符
防止SQL从URL注入:
sql_inj.java代码:
- package sql_inj;
- import java.net.*;
- import java.io.*;
- import java.sql.*;
- import java.text.*;
- import java.lang.String;
- public class sql_inj{
- public static boolean sql_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 (int i=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)
- {
- return 1;
- fibdn = new Array (”‘” ,”\\”,”/”);
- 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)
- { return 0; }
- }
- }
- return 1;
- }
===================================
总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。
凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了
转载于:https://www.cnblogs.com/soulaz/p/5587264.html
java 防止sql注入的方法(非原创)相关推荐
- java开发中推荐的防御sql注入方法_防御SQL注入的方法总结
SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致 ...
- sql注入修复方法是_旧的方法是修复我们可以看到的内容。
sql注入修复方法是 When envisioning the futurestate of a company or a service, we're usually faced with the ...
- java 防止sql注入_Java中SQL注入以及如何轻松防止它
java 防止sql注入 什么是SQL注入? (What is SQL Injection?) SQL Injection is one of the top 10 web application v ...
- SQL注入原理及预防SQL注入的方法
网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,担心网上的信息以及个人隐私遭到泄露.下面要为大家介绍的是SQL注入,对于sql注入,相信程序员都知道或者使用过,如果没有了解或完全没有听 ...
- mysql 8.0 自定义函数_PHP+Mysql防止SQL注入的方法(life)
这篇文章介绍的内容是关于PHP+Mysql防止SQL注入的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 我的官方群点击此处. 方法一: mysql_real_escape_str ...
- mysql 防注入 php_PHP+mysql防止SQL注入的方法小结
本文实例讲述了PHP+mysql防止SQL注入的方法.分享给大家供大家参考,具体如下: SQL注入 例:脚本逻辑 $sql = "SELECT * FROM user WHERE useri ...
- decimal转为string sql_PHP+Mysql防止SQL注入的方法
这篇文章介绍的内容是关于PHP+Mysql防止SQL注入的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 我的官方群点击此处. 方法一:[1] mysql_real_escape_ ...
- mysql简单防注入_mysql防止sql注入的方法
mysql防止sql注入的方法 发布时间:2020-08-25 14:07:29 来源:亿速云 阅读:98 作者:小新 这篇文章将为大家详细讲解有关mysql防止sql注入的方法,小编觉得挺实用的,因 ...
- php防止sql注入处理方法
解决的办法是将php.ini的magic_quotes_gpc设置为Off 在php.ini的magic_quotes_gpc=On的情况下,如果输入的数据有单引号(').双引号(").反斜 ...
最新文章
- 把共享库(SO)加载到指定的内存地址
- 硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统!
- java开发 时间类型的转换
- C#Winform调用网页中的JS方法
- 11.乘最多水的容器
- 详细理解中缀表达式并实现
- 二十一世纪大学英语读写基础教程学习笔记(原文)——4 - The Happiest Man in the World(世界上最幸福的人)
- 东方博宜OJ 1863 - 【入门】特殊的数字四十
- 超级好用的国际汇兑平台--Transferwise
- Jira 史诗指南 (2022)
- Windows自动同步网络时间
- java调用海康威视人脸识别抓拍
- C语言程序设计卢萍,卢萍
- Surely Vue-去除水印
- Redis 如何做内存优化?
- 担心PPT封面页不够出彩?这些例子你都知道吗?
- Reflex WMS入门系列二十二:物料库存报表
- 互联网公司的软件开发流程
- 二哥,你知道腾讯的技术职级吗?
- ISO16000-9建筑产品和家具中挥发性有机物的测试
热门文章
- android判断是否被点击方法,android 中有没有判断imageview是否以被单击的函数方法?...
- notepad++列编辑操作
- mysql------变量
- 对于已经加入版本控制的文件,我们可以强制忽略文件git update-index --assume-unchanged local.properties...
- GDAL不支持创建PCIDSK的面状矢量格式
- TortoiseGit(Windows)使用方法汇总
- linux sd启动盘制作工具,制作Mini Linux U盘启动盘
- qqbot python_Python3.6 QQBot 机器人 - 注册响应函数
- kettle spoon判断增量更新_【论文推荐】张斌等:基于改进 SOINN 算法的恶意软件增量检测方法...
- MySql性能优化学习路线图