旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

怎样防备sql注入?防备SQL注入的五种完成体式格局【MySQL教程】,sql,防注入

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:34评论:0


导读:一、SQL注入简介SQL注入是比较罕见的收集进击体式格局之一,它不是应用操作体系的BUG来完成进击,而是针对顺序员编程时的忽视,经由历程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就能够 ,牢记不要用拼接字符串的要领就能够了。

本文重要讲了五种完成防备sql注入的要领,更多相干内容请关注ki4网。

相干引荐:

关于MySQL 的高可用性:Keepalived 双主热备

运用php写出几种罕见的排序算法顺序

PHP怎样推断是不是为AJAX要求?

以上就是怎样防备sql注入?防备SQL注入的五种完成体式格局的细致内容,更多请关注ki4网别的相干文章!

标签:sql防注入


欢迎 发表评论: