jsp工程防止外部注入_防止 jsp被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就可以 ,切记不要用拼接字符串的方法就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpress是用php几开发的,php-WordPress多个开发人员设置

是否可以让一个以上的人通过测试站点来开发Wordpress应用程序,这是一个很好的选择.我遇到的最大障碍是在本地开发和集成到测试环境时的路径问题.是否有人拥有维护开发人员环境,保持工作内容和链接的良好流程,并且代码在源代码管理中维护&#xff1f;为了澄清起见,我想在本地开发…

python分布式对象存储_推荐:一款分布式的对象存储服务

最近公司在准备内部数据上云&#xff0c;并且内部数据库每天的数据量很大&#xff0c;需要采用大数据存储的方案。方案调研每个程序技术在实现之前&#xff0c;需要进行开源产品的调研&#xff0c;适合自己产品的技术方案才是最好的。需求我们需要处理是图像信息&#xff0c;大…

php如何检测键盘按键,js键盘事件,判断按下的是哪个键

在写页面的时候&#xff0c;尤其是桌面端的时候&#xff0c;我们有时候要知道用户按下了那个按键&#xff0c;对于这个问题我们可以使用js提供的keyCode属性来操作&#xff0c;如&#xff1a;document.onkeydown function (e) {alert(e.keyCode)}这时你在页面上随意按键盘的按…

bch纠错码 码长8_BCH码-BCH码原理-BCH码分类-BCH码的应用-什么是BCH码-测控百科-CK365测控网...

1BCH码概述BCH码取自 Bose、Ray-Chaudhuri 与 Hocquenghem 的缩写&#xff0c;是自1959年发展起来的一种能纠正多位错误的循环码&#xff0c;是编码理论尤其是纠错码中研究得比较多的一种编码方法。用术语来说&#xff0c;BCH 码是用于校正多个随机错误模式的多级、循环、错误校…

oracle 左取,oracle 取子串(转)

SUBSTRING返回字符、binary、text 或 image 表达式的一部分。有关可与该函数一起使用的有效Microsoft SQL Server? 数据类型的更多信息&#xff0c;请参见数据类型。语法SUBSTRING ( expression , start , lengt…

js 中转换成list集合_js将类数组对象转换成数组对象

javascript与dom有许多瑕疵&#xff0c;如著名的类数组对象Arguments&#xff0c;其他诸如HTMLCollection,NodeList如果它们都是数组的子类&#xff0c;那多省时啊。在标准浏览器中&#xff0c;好像只要对象存在length属性&#xff0c;就能把它转换为数组&#xff0c;但IE就不尽…

oracle插入未调用并行,oracle并行之概念篇

概念 串行执行&#xff1a; 串行执行时候,sql语句由一个server process处理(既只运行在一个cpu上),所以sql语句所能使用的资源受cpu限制,除去异步i/o外server process 处理cpu操作时&#xff0c;不可访问disk。 并行处理&#xff1a; 就是多个slave process一起处理同一个sql语…

三维数据平滑处理_黑白象片的密度信息 卫星数据处理 遥感制图 三维建模 善图科技...

黑白象片的密度信息象片上的黑白变化&#xff0c;可划分为若干等级&#xff0c;此等级称之为灰阶。象片上的灰阶数受洗印技术及目视分辨能力的限制&#xff0c;一般不超过10个灰阶。灰阶较多时&#xff0c;象片上层次分明易于分辨一些细节。但灰阶的增多必导至对比度相对下降&a…

oracle左连接数据会对不上吗,一周工作总结–左连接造成的一些问题-Oracle

一周工作总结–左连接造成的一些问题今天有同事告诉我&#xff0c;有个SQL执行了好久好久执行不出来&#xff0c;我说好就是多久&#xff1f;她说一天左右了。真是令人咋舌的SQL。于是我要来了SQL看了看执行计划&#xff0c;确实让人咋舌。下图中就是执行计划的截图&#xff1a…

android开发 视图联动_新版首页技术设计和实现方案(Android)

动效设计1、两级吸顶CoordinatorLayoutAppBarLayout可以轻松的实现一级吸顶的功能&#xff0c;两级吸顶并不支持。要实现两级吸顶&#xff0c;可以有两种思考&#xff1a;一&#xff0c;在此基础之上再完成一次吸顶&#xff1b;二&#xff0c;直接重写两次吸顶的逻辑&#xff0…

oracle 获取一周七天,Oracle中求出本礼拜第一天和第七天的日期

<1>西方应用是周日是first day&#xff0c;中国人思维则为&#xff0c;周日是最后一天。其实&#xff0c;只需要计算到周一&#xff0c;就可直接获得周日。<2>应用实例--Sundayselect to_date(next_day(to_date(2015-02-09 22:00:00, yyyy-mm-dd hh24:mi:ss) - 7, …

网页设计上机考试原题_全国计算机三级信息安全考试 经验分享

为什么选择信息安全&#xff1f;误打误撞报的名&#xff0c;正好又听说是三级里面最好过的。1&#xff09;时间&#xff1a;九月份的考试&#xff0c;大概六月份报名。我在9月2日开学后&#xff0c;才开始准备的&#xff0c;也就二十几天的时间&#xff0c;而且我白天课不少&am…

oracle to_char 数值,oracle to_char格式数值

C:\Users\XXX>sqlplus / as sysdbaSQL*Plus: Release 10.2.0.5.0 - Production on 星期日 8月 28 15:51:42 2016Copyright (c) 1982, 2010, Oracle. All Rights Reserved.连接到:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit ProductionWith the Par…

linux环境特性的文件夹,在Linux环境下如何消减可执行文件或者动态库的大小

为了简化描述&#xff0c;下文提到目标时&#xff0c;如无特殊说明&#xff0c;均指代目标可执行文件或者目标动态库。操作步骤如下&#xff1a;选型时&#xff0c;在同等功能时&#xff0c;尽量选择代码量少、占用空间小的开源的软件。控制C特性的使用&#xff0c;如无必要&am…

newifi mini固件_如何在vmware虚拟机中安装OpenWrt系统,含x86固件编译教程

"OpenWrt项目是针对嵌入式设备的Linux操作系统"&#xff0c; 这是官方给出的定义。OpenWrt确实是一个非常好的嵌入式学习系统&#xff0c;目前市面上上千款设备支持运行OpenWrt&#xff0c;如小米路由、newifi、netgear路由、360路由等。各大wifi芯片厂商sdk开始采用…

宝塔linux忘记密码,宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办

因为性能和安全性上的突出优势&#xff0c;现在用宝塔LINUX面板配置网站环境的站长越来越多&#xff0c;但一些粗心大意的站长经常会遇到这个问题&#xff0c;密码想不起来了&#xff0c;入口链接忘记了&#xff0c;宝塔忘记登录入口了怎么解决 宝塔面板密码忘记了怎么办呢&…

minitab怎么算西格玛水平_六西格玛黑带培训工具因子分析的使用

六西格玛黑带培训工具因子分析的使用-张驰咨询一、该命令用于将数据结构简化为较少的量&#xff0c;因子分析的重点是确定能够解释数据变异大的因子数量。二、对话框内容。1、variables&#xff1a;输入需包含在分析中的变量栏。2、Numberoffactorstoextract&#xff1a;输入需…

ssh linux 配置文件详解,Linux ssh服务常用配置的详细描述及建议配置

SSH服务常用选项描述配置文件&#xff1a; /etc/ssh/sshd_config1、AddressFamliy any&#xff1b;支持那IP协议&#xff1b;比如ipv4,ipv6,&#xff1b;默认 any&#xff1b;2、Port 22 &#xff1a;SSH端口号配置&#xff0c;默认22;3、Protocol 2 &#xff1b; SSH协议的2版…

python set集合内部实现_Python 实现集合Set的示例

Python的集合set原理集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合&#xff0c;注意&#xff1a;创建一个空集合必须用 set() 而不是 { }&#xff0c;因为 { } 是用来创建一个空字典。class Array(object):def __init__(self, size32, ini…

linux curl 编译命令,linux 编译 curl 出错

编译curl make 死活不通过&#xff0c;唉执行参数如下&#xff0c;谢谢各位帮忙看看这一步一切正常rootdebian:~/curl-7.45.0# ./configure --with-sslmake一顿编译之后 ...... 然后出错了../lib/.libs/libcurl.so: undefined reference to SSLv2_client_method../lib/.libs/li…