首先,SQL
介绍
SQL
注入是更常见的网络攻击之一。它不使用操作系统的错误来实现攻击,但程序员编程的疏忽,通过 SQL
语句,实现无帐户登录,甚至篡改数据库。
二,整体思想?? SQL
注射攻击
1.寻找 SQL
注入的位置
2.判断服务器类型和背景数据库类型
3. SQL
注入攻击对无关的服务器和数据库功能
第三,SQL
注入攻击实例
例如,在登录界面中,询问用户名和密码:
您可以实现这样的免除账户:
用户名:’或 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
=“或 1 = 1 用户名相等”或 1 = 1,则此条件将成功; 然后添加两个回来 – 这意味着评论,它将稍后发表评论,让他们不起作用,这样的语句将始终正确执行,用户易于欺骗系统,获得法律身份。 如果执行情况,这仍然相对温和.
SELECT
* FROM
user_table
WHERE
username
='' ;DROP
DATABASE
(DB
Name
) --' and
password
=''
….后果可以想象……
第四,正确的方法
让我谈谈 JSP
,说正确的方法:
1.(简单有效的方法)预付术
使用预编译的语句集,它内置于处理 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.字符串过滤
比较通用的一个方法:
(||之间的参数可以根据自己程序的需要添加)
4.jsp
中调用该函数检查是否包函非法字符
防止 SQL
从 URL
注入:
sql_inj
.java
代码:
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
就可以 ,切记不要用拼接字符串的方法就可以了。
转载请注明:汇站网 » 防止 SQL
注入的五种方法