문제

ASP.NET 응용 프로그램에서 SQL 주입에 취약하지 않아야합니다. 이것을 어떻게 달성 할 수 있습니까?

도움이 되었습니까?

해결책

질문이 매우 일반적이지만 몇 가지 규칙이 항상 적용됩니다.

  • 매개 변수화 쿼리 사용 (SqlCommand ~와 함께 SqlParameter)) 및 사용자 입력을 매개 변수에 넣습니다.
  • 확인되지 않은 사용자 입력에서 SQL 문자열을 구축하지 마십시오.
  • 모든 종류의 기형에 대해 사용자 입력을 확인할 수있는 소독 루틴을 구축 할 수 있다고 가정하지 마십시오. 가장자리 케이스는 쉽게 잊혀집니다. 숫자 입력을 점검하는 것은 안전한쪽에 도착할 수있을 정도로 간단 할 수 있지만 문자열 입력의 경우 매개 변수를 사용합니다.
  • 두 번째 레벨 취약 상태를 확인하십시오 - 이러한 값이 사용자 입력으로 구성된 경우 SQL 테이블 값에서 SQL 쿼리 문자열을 구축하지 마십시오.
  • 저장된 절차를 사용하여 데이터베이스 작업을 캡슐화하십시오.

다른 팁

사용 준비된 진술 ( '제품의 노드를 추가하기 위해 준비된 명령문을 사용하는 ASP.NET 튜토리얼 링크). 그게 전부입니다.

글쎄, 그게 또는 orm을 사용합니다 LINQ에서 SQL 또는 nhibernate, 그들은 내부적으로 준비된 진술을 사용합니다.

매개 변수를 사용하십시오! 정말 간단합니다 :-)

이와 같은 쿼리를 만듭니다 (C#이있는 MS SQL Server의 경우) :

SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn); 

여기 @name은 SQL 주입을 피하려는 매개 변수이며 Conn은 SQLConnection 객체입니다. 그런 다음 매개 변수 값을 추가하려면 다음을 수행합니다.

getPersons.Parameters.AddWithValue("@Name", theName);

여기에서 이름은 검색하는 이름을 포함하는 변수입니다.

이제 해당 쿼리에서 SQL 주입을 수행하는 것은 불가능합니다.

이 간단하기 때문에 매개 변수를 사용하지 않을 이유가 없습니다.

사용자 입력을 신뢰하지 마십시오 - 유효성 검사 컨트롤, 정규 표현식, 코드 등을 사용하여 모든 텍스트 상자 항목 유효성 검사

동적 SQL을 사용하지 마십시오 - 매개 변수화 된 SQL 또는 저장 절차를 사용하십시오

관리자 수준 계정을 사용하여 데이터베이스에 연결하지 마십시오 - 제한된 액세스 계정을 사용하여 데이터베이스에 연결

비밀을 평범한 텍스트로 저장하지 마십시오 - 암호화 또는 해시 암호 및 기타 민감한 데이터; 연결 문자열도 암호화해야합니다

예외는 최소한의 정보를 공개해야합니다 - 오류 메시지에 너무 많은 정보를 공개하지 마십시오. CustomerRors를 사용하여 처리되지 않은 오류가 발생한 경우 최소 정보를 표시합니다. 디버그를 False로 설정하십시오

MSDN에서 유용한 링크 SQL 주입을 중지하십시오

예를 들어 데이터베이스에 대한 쿼리가 실시간으로 구성되기 때문에 SQL 주입이 발생합니다.

SELECT * From Table1 WHERE " + UserInput

UserInput 악의적이며 의도하지 않는 다른 진술을 포함 할 수 있습니다.

그것을 피하려면 쿼리를 함께 연결하지 않아야합니다.

매개 변수화 쿼리를 사용하여이를 달성 할 수 있습니다. DBCommand 특정 DB 풍미에 대한 물체.

매개 변수화 된 쿼리 및/또는 저장된 절차를 사용하고 SQL 매개 변수를 통해 매개 변수를 구문 분석하십시오. 절대 문자열을 연결하여 SQL 코드를 생성합니다. SQL 주입을 방지하는 것은 보안의 작은 부분이기 때문에 SQL 주입 및 보안 코드 작성에 대해서도 읽습니다. 더 많은 것이 있습니다 (XSS -Cross Site Scripting). 해커가 사이트/응용 프로그램을 타협하려면 SQL 주입 만 더 많이 찾을 것입니다.

Scott Guthrie 괜찮은 작은 기사를 게시했습니다 이것에 대해 잠시 뒤에. 그것에서 그는 자신을 보호하기위한 5 가지 제안을 제공합니다.

  1. 유형-안전 매개 변수 인코딩 메커니즘을 사용하지 않고 동적 SQL 문을 구축하지 마십시오. [...]

  2. 응용 프로그램에 대한 보안 검토를 항상 제작하기 전에 응용 프로그램에 대한 보안 검토를 수행하고 업데이트 할 때 언제든지 모든 코드를 검토 할 수있는 공식적인 보안 프로세스를 설정하십시오. [...]

  3. 민감한 데이터를 데이터베이스 내에서 Clear-Text에 저장하지 마십시오. [...]

  4. 데이터 액세스 계층과 SQL 주입 공격에 대한 응용 프로그램을 구체적으로 검증하는 자동화 장치 테스트를 작성하십시오. [...]

  5. 데이터베이스를 잠그면 웹 애플리케이션에만 액세스하여 기능 해야하는 최소한의 권한 세트에만 액세스하십시오. [...]

그는 설명하는 괜찮은 일을합니다 이것들은 중요하며 다른 여러 리소스와의 링크도 ...

사용자 입력을 신뢰하지 말고 항상 검증하고 SQL 매개 변수를 사용하십시오. SQL 주입을 방지하기에 충분한 근거가되어야합니다.

바라건대, 이것은 도움이 될 것입니다 :

http://www.codersbarn.com/post/2008/11/01/aspnet-data-input-validation.aspx

짧은 대답은 매개 변수화 쿼리를 사용하는 것입니다.

Anthony :-) www.codersbarn.com

항상 매개 변수화 된 쿼리 만 사용하십시오.

다른 사람들이 말했듯이, 동적 SQL 문을 생성하기 위해 사용자 입력을 연결하지 마십시오. 동적 SQL을 사용할 때는 항상 매개 변수화 된 SQL을 사용하십시오. 하지만 저장된 Proc 내부에서 동적 SQL을 만들 때이 규칙이 적용된다는 점을 지적합니다.. 이 사실은 사람들이 종종 간과하는 것입니다. 그들은 "저장된 절차를 사용하고 있기 때문에 안전하다고 생각합니다.

"보안 ASP.NET 애플리케이션 구축"가이드 라인은 다음과 같습니다. 부분 이 주제에 대해.

Microsoft.security.application.antixss.urlencode 및 SQL 주입은 작동하지 않습니다. 또는 ASP.NET - JSON - 직렬화 및 사제화를 사용할 수 있습니다.

또한 MacFee FRE 도구의 Sittietigger로 응용 프로그램을 테스트하십시오.

출신이 거의 없습니다 여기

.NET 보안 툴킷 v1.0 .netmon v1.0 validator.net v1.0

모두가 "매개 변수 사용"이라고 말합니다. 너무 어렵지 않다면 우리는 그것을 덜 말해야 할 것입니다.

사용 queryfirst. 연결에 대한 유혹이 제거되고 올바른 방법이 가장 쉬운 방법이됩니다. SQL에 @myparam을 입력하여 매개 변수를 만듭니다. 도구는 나머지 도구를 수행합니다.

면책 조항 : QueryFirst를 썼습니다

정확히 SQL 주입이 무엇인지 이해하고 그에 취약한 것을 쓰지 마십시오.

저장된 절차를 사용하고 데이터의 입력을 검증하십시오. 삽입과 같은 직접 SQL을 사용하지 마십시오 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top