1. SQL 인젝션 소개
SQL 인젝션은 가장 일반적인 네트워크 공격 방법 중 하나로, 공격을 구현하기 위해 운영체제의 BUG를 사용하지 않습니다. 프로그래머프로그래밍 부주의SQL문을 통해 계정 없이 로그인이 가능하게 했고, 심지어 데이터베이스를 변조하기도 했습니다.
2. SQL 인젝션 공격의 일반적인 개념
1. SQL 인젝션 위치를 파악
2. 백그라운드 데이터베이스 유형
3. 다양한 서버 및 데이터베이스 특성을 기반으로 SQL 주입 공격 수행
3. 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 문을 분석합니다.
사용자 이름=”또는 1=1 사용자 이름이 같음” 또는 1=1 조건 후에 이 조건은 다음과 같습니다. 확실히 성공합니다.
그런 다음 주석 을 의미하는 Two - 뒤에 추가하면 다음 명령문에 주석을 달아 무효화하므로 명령문이 항상 올바르게 실행될 수 있으며 사용자는 다음 명령문을 사용할 수 있습니다. 쉽게 시스템을 속이고 법적 신분을 얻을 수 있습니다.
SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''
를 실행하면... 결과는 상상할 수 있습니다.
4. 대처 방법
이제 JSP를 다루는 방법에 대해 이야기하겠습니다.
1. (간단하고 효과적인 방법)PreparedStatement
는 다음과 같은 미리 컴파일된 명령문 세트를 사용합니다. 내장 SQL 주입을 처리하려면 setXXX 메소드를 사용하여 값을 전달하면 됩니다.
사용 시 이점:
(1). 코드 가독성 및 유지 관리.
(2).PreparedStatement는 성능을 최대한 향상시킵니다.
( 3) 가장 중요한 점은 보안을 크게 향상시킨다는 것입니다.
원리:
SQL 삽입은 SQL 문의 준비(컴파일) 과정에만 영향을 미칩니다. 파괴적인 효과
실행 단계에서는 입력 문자열만 데이터
로 처리하고 더 이상 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就可以 ,切记不要用拼接字符串的方法就可以了。
【相关推荐】
1. 特别推荐:“php程序员工具箱”V0.1版本下载
위 내용은 SQL 주입을 방지하는 방법은 무엇입니까? SQL 인젝션을 방지하는 5가지 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!