이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 16201|회답: 0

[ASP.NET] 안티-SQL 주입의 ASP.NET

[링크 복사]
게시됨 2015. 4. 17. 오후 1:06:50 | | |

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 볼 수 있습니다.

  1. public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
코드 복사


DbTye 또는 SqlDbType은 다양한 데이터 타입이 될 수 있습니다.
데이터 타입에 따라 선택할 수 있습니다.
일부 지역에서는 매개변수의 길이를 지정하는 데도 사용될 수 있습니다: 정정형 크기. 이로 인해 데이터베이스 오버플로우와 SQL 노트가 효과적으로 방지됩니다
진입 가능성.
장점: SQL 인젝션을 효과적으로 방지합니다.
단점: 일부 장소는 적용이 불가능합니다.

3. 화이트리스트

설명:
알려진 매개변수 범위 중 일부는 화이트리스트 형태로 처리할 수 있어 SQL 주입 및 쿼리를 방지할 수 있습니다
예를 들어, +열 이름으로 정렬할 때, 열명이 매개변수 형태로 전달될 때, 먼저 매개변수를 판단하는 화이트리스트를 만들 수 있습니다
숫자가 화이트리스트에 있는지 여부, 그리고 쿼리 후에 쿼리를 해야 합니다. 그렇지 않으면 잘못 처리됩니다.
장점: 안전하고 신뢰할 수 있음
단점: 적용 범위가 적음




이전의:텍스트 박스는 숫자만 입력할 수 있게 해줍니다
다음:asp.net 텍스트 편집기(FCKeditor)
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com