1. SQL 인젝션이란 무엇인가요? 이른바 SQL 인젝션은 도메인 이름이나 페이지 요청의 쿼리 문자열을 제출하거나 입력하기 위해 폼 폼에 SQL 명령을 삽입하고, 마지막으로 서버를 속여 악성 SQL 명령을 실행하게 만드는 것입니다. 영리한 SQL 문장을 만들기 위해 매개변수를 제출함으로써 원하는 데이터를 성공적으로 얻을 수 있습니다.
2. SQL 주입 종류 구체적으로 SQL 인젝션은 숫자 인젝션, 문자 인젝션, 검색 인젝션(like), 인젝션, 문장 연결 인젝션의 다섯 가지 범주로 나눌 수 있습니다. 응용 관점에서는 IP 내 SQL 주입, 검색, 배치 삭제, 데이터베이스 간 전송에 특별한 주의를 기울여야 합니다.
3. 주사 방법
전형적인 예를 살펴보겠습니다
SqlCommand cmd = new SqlCommand("SELECT * FROM PE_USERS WHERE UserName = '" 2+ 사용자 이름 + "' AND UserPassword = '" + 패스워드 + "'", 조항); UserName과 PassWord에 대한 검증이 없으므로, 만약 UserName="admin' OR 1=1--"가 있을 경우에 실행된 SQL 문은 다음과 같습니다:
UserName='admin' 또는 1=1—' AND UserPassword='' PE_USERS에서 * 선택하세요 이로 인해 SQL 인젝션이 발생하고, 조건이 항상 성립하므로 비밀번호 없이도 성공적으로 로그인할 수 있습니다.
4. SQL 인젝션 방지 방법
1. 의심스러운 문자열을 필터링하거나 변환합니다
위험한 문자열을 필터링하거나 변환하는 함수를 작성한 후 GLOBAL.ASAX를 사용하거나 컨텍스트 인스턴스를 다시 작성함으로써 SQL 인젝션을 방지할 수 있습니다
예를 들어보겠습니다
public static bool SqlFilter2(string InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join"; 4 if(InText==null) 5는 거짓으로 돌아오고; 6 foreach(word의 문자열 i. 스플릿('|')) 7 { 8 만약 ((InText.ToLower(). IndexOf(i+" ")>-1)|| (InText.ToLower(). IndexOf(" "+i)>-1)) 9 { 10은 진으로 돌아오고; 11 } 12 } 13은 거짓으로 돌아오고; 14 }
2. 글로벌.asax
protected void Application_BeginRequest(객체 발신자, EventArgs e) 2 { 3 // 숨겨진 도메인을 제외한 Post 매개변수 횡단 4 foreach(여기서 문자열 i). 요청.양식) 5 { 6 if(i=="__VIEWSTATE")가 계속된다; 7 this.goErr(this. Request.Form.ToString()); 8 } 9 // Get 파라미터를 트래버스하세요. 10 foreach(여기서 문자열 i. Request.QueryString) 11 { 12 this.goErr(이것. Request.QueryString.ToString()); 13 } 14 } private void goErr(string tm) 2 { 3 만약 (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 이거. Response.end() 5 } 장점: 이 점은 대부분의 초보 프로그래머들이 SQL 인젝션을 막기 위해 사용하며, 대부분의 경우 인젝션을 효과적으로 방지하는 데 효과적입니다.
단점: 1. 원래 주입에 사용되지 않은 일부 문자를 필터링하여 예상치 못한 문제를 일으킵니다. 예를 들어, 포럼 회원의 이름에 필터링된 문자와 동일한 문자가 포함되어 있다면, 예상치 못한 문제와 문제를 일으킬 수 있습니다.
2. 매번 필터링이나 변환이 필요해 프로그램의 효율성을 떨어뜨립니다
2. 매개변수 쿼리에 저장 프로시저를 사용하세요
SQL 인젝션의 주요 목적은 악성 SQL 코드를 제출하여 데이터베이스에서 악성 명령을 실행하는 것입니다. 따라서 SQL 명령어가 실행 전에 처리되는 한 SQL 인젝션을 효과적으로 방지할 수 있습니다. 매개변수화된 쿼리는 SQL 인젝션을 효과적으로 방지할 수 있습니다.
예시
const string strSql = "SELECT * FROM [PE_Users] WHERE UserName = @UserName"; 매개변수 parms = 새로운 매개변수("@UserName", DbType.String, userName); 위에 Prarmeter 객체를 사용하는 매개변수 @UserName이 있으며, 이를 통해 매개변수가 Command 객체에 추가됩니다. 이렇게 하면 매개변수화된 쿼리가 생성됩니다. 앞서 설명한 대로, ADO.NET SQL Server에 다음과 같은 SQL 문장을 전송합니다:
Exec sp_executesql N '* 선택, [pe_users] 중 사용자 이름=@username ',N '@username nvarchar(20) ',@username=N '이름' SQL Server는 쿼리를 실행하기 전에 @username를 문자열 "name"으로 대체합니다. 다음과 같은 입력이 있다고 가정해 봅시다:
'유니언 선택 @@version, null, null— 생성된 SQL 문장은 다음과 같습니다:
Exec sp_executesql N '* 선택, [pe_users] 중 사용자 이름=@username ',N '@username nvarchar(20) ',@username=N ''' union select @@version, null, null--' 입력에서 벗어나는 ADO.NET 볼 수 있습니다.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
코드 복사
DbTye 또는 SqlDbType은 다양한 데이터 타입이 될 수 있습니다. 데이터 타입에 따라 선택할 수 있습니다. 일부 지역에서는 매개변수의 길이를 지정하는 데도 사용될 수 있습니다: 정정형 크기. 이로 인해 데이터베이스 오버플로우와 SQL 노트가 효과적으로 방지됩니다 진입 가능성. 장점: SQL 인젝션을 효과적으로 방지합니다. 단점: 일부 장소는 적용이 불가능합니다.
3. 화이트리스트
설명: 알려진 매개변수 범위 중 일부는 화이트리스트 형태로 처리할 수 있어 SQL 주입 및 쿼리를 방지할 수 있습니다 예를 들어, +열 이름으로 정렬할 때, 열명이 매개변수 형태로 전달될 때, 먼저 매개변수를 판단하는 화이트리스트를 만들 수 있습니다 숫자가 화이트리스트에 있는지 여부, 그리고 쿼리 후에 쿼리를 해야 합니다. 그렇지 않으면 잘못 처리됩니다. 장점: 안전하고 신뢰할 수 있음 단점: 적용 범위가 적음 |