在线客服:
亚博代理推荐 亚博代理推荐
全国服务热线:010-76089475
您的位置:首页 > 新闻中心 >

防止SQL注入的五种方法

浏览 166次 来源:【jake推荐】 作者:-=Jake=-    时间:2021-01-15 20:03:29
[摘要] SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。sql注入只对sql语句的准备(编译)过程有破坏作用而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

一、SQL注入简介

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

二、SQL注入攻击的一般思想

1.查找SQL注入的位置

2.确定服务器类型和后端数据库类型

3.针对不同服务器和数据库特征的SQL注入攻击

三、SQL注入攻击示例

例如,在登录界面中,需要用户名和密码:

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

用户名:‘或1 = 1 –

密码:

单击以登录。如果没有特殊处理,则非法用户将以登录为傲。(当然,某些语言的数据库API已经解决了这些问题)

这是为什么?让我们在下面进行分析:

从理论上讲,后台身份验证程序中将包含以下SQL语句:

字符串sql =“从user_table中选择*,其中username =

'“ + userName +”'和密码='“ + password +”'“;

输入上述用户名和密码后,上述SQL语句变为:

SELECT * FROM user_table WHERE username =

'’或1 = 1-和密码='’

分析SQL语句:

在条件用户名=“或1 = 1用户名等于”或1 = 1之后,此条件将成功;

然后在末尾添加两个-表示注释,它将注释以下语句亚博网页版 ,这样它们将不起作用,从而始终可以正确执行该语句,并且用户可以轻易地欺骗系统以获取合法性身份。

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

SELECT * FROM user_table WHERE

username =''; DROP DATABASE(DB Name)-'和password =''

...后果可想而知...

四、如何处理

下面让我讨论如何处理JSP:

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

使用预编译的语句集,它具有处理SQL注入的内置功能,只需使用其setXXX方法传递值即可。

使用好处:

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

(2).PreparedStatement尽最大努力提高性能。

(3)。最重要的一点是大大提高安全性。

原理:

SQL注入仅对SQL语句的准备(编译)有破坏作用

PreparedStatement准备就绪鸭脖官网亚博vip ,执行阶段只是将输入字符串视为数据处理防止sql注入

不再解析和准备sql语句,因此避免了sql注入问题。

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

要导入的包裹:

导入java.util.regex。*;

正则表达式:

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

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

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

检查正则表达式以获取SQL元字符:

/(\%27)|(\’)|(\-\-)|(\%2 3) |(#)/ ix

修复用于检测SQL元字符的正则表达式:/((\%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.字符串过滤

更通用的方法:

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

公共静态布尔sql_inj(String str)

{

字符串inj_str =“'|和| exec |插入|选择|删除|更新|

count | * |%| chr | mid | master |截断| char |声明|; |或|-| + |,“;

字符串inj_stra [] = split(inj_str,“ |”);

for(int i = 0; i

{

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

{

返回true;

}

}

返回假;

}

4.在jsp中调用此函数以检查是否包含非法字符

防止从URL进行SQL注入:

sql_inj.java代码:

软件包sql_inj;

import。*;

导入java.io。*;

导入java.sql。*;

导入java.text。*;

import java.lang.String;

公共类sql_inj {

公共静态布尔sql_inj(String str)

{

字符串inj_str =“'|和| exec |插入|选择|删除|更新|

count | * |%| chr | mid | master |截断| char |声明|; |或|-| + |,“;

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

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

for(int i = 0; i

{

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

{

返回true;

}

}

返回假;

}

}

5.JSP页面判断代码:

使用javascript阻止客户端上的不安全字符

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

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

返回值:0:是1:否

函数名称是

功能检查(a)

{

返回1;

fibdn = new Array(“‘”防止sql注入,“ \\”,“ /”);

i = fibdn.length;

j = a.length;

for(ii = 0; ii

{代表(jj = 0; jj

{temp1 = a.charAt(jj);

temp2 = fibdn [ii];

if(tem’; p1 == temp2)

{返回0; }

}

}

返回1;

}

=================================

通常,为了防止进行一般的SQL注入,只需按照代码标准努力。

当执行的SQL中有变量时,JDBC(或其他数据持久层)提供以下内容:PreparedStatement。请记住不要使用拼接字符串的方法。

老王
本文标签:注入,表达式,语句

推荐阅读

最新评论