it-swarm-korea.com

SQL 삽입 방지를위한 모범 사례?

SQL 주입은 특히 웹 보안과 관련하여 항상 인기있는 주제입니다. 이와 관련하여 웹 응용 프로그램 내에서 SQL 삽입을 방지하기 위해 항상 수행해야 할 단계는 무엇입니까? 또한 이러한 정상적인 단계 외에도 사람들이 정상을 넘어서서 그것을 막기 위해 다른 일이 있습니까?

17
Mark Davidson

이 질문에 대해 이미 매우 좋은 답변이지만 더 언급하고 싶습니다.

  • 안전한 코딩 (이미 많은 사람들이 이미 언급 한 것)
    • 이스케이프 사용자 입력
    • 매개 변수화 된 쿼리 (준비된 문, 변수 만 바인딩하는 미리 정의 된 쿼리)
    • 방어 적으로 코드
  • 공격 모니터링
    • NIDS (Network Intrusion Detection System)
    • 호스트 침입 탐지 시스템 (HIDS)
    • 애플리케이션 침입 탐지 시스템 (AppIDS)
  • 공격 차단
    • 응용 프로그램 방화벽
    • 데이터베이스 방화벽
    • 웹 응용 프로그램 방화벽
      • 아파치 모드
      • 시스코 애플리케이션 속도 시스템 (AVS)
  • 취약점에 대한 프로브
    • 자동 블랙 박스 주입 테스트
    • 정적 소스 코드 분석
    • 수동 침투 테스트

이것은 prevention에만 해당되며 sql server hardening을 고려하지 않았습니다. 그러나 많은 유사점이 있습니다.

주입에 이미 취약한 경우 추가 방어는 다음과 같습니다.

  • 필요한 최소한의 보조금으로 응용 프로그램 실행
    • 특히 필요한 데이터베이스 및 테이블에 대한 액세스 권한 만 부여하십시오.
    • 필요한 특권 만 부여하십시오 (일반적으로 선택, 삽입, 업데이트).
19
Chris Dale

준비된 문장, 매개 변수화 된 쿼리, 모든 사용자 입력을 피하기위한 좋은 시작을 위해서는 http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet 를 참조하십시오.

16
Weber

핵심 방어는 데이터베이스 쿼리를 안전하게 이스케이프하는 API 만 사용하는 것입니다. 일반적으로 매개 변수화 또는 준비된 명령문이라고합니다. 테이블 또는 열 이름과 같은 SQL 식별자가 런타임에 제공되는 경우와 같이 모든 경우에 사용할 수는 없지만 가능한 경우 가장 좋은 방법입니다 (대부분의 경우).

참고-이로 인해 데이터베이스에 유해한 데이터가 입력 될 수 있으므로 응용 프로그램의 다른 곳에서이 데이터를 사용할 때주의하십시오

두 번째 방어는 탈출 방식을 취하는 것입니다. 이것은 "작은 따옴표를 두 따옴표로 대체"접근 방식입니다. 이런 식으로 가야한다면 잠재적으로 유해한 문자를 모두 이스케이프해야합니다. 이는 경우에 따라 작은 따옴표 이상을 의미합니다. 가능한 경우 OWASP ESAPI와 같은 고급 라이브러리를 사용하거나 OWASP SQL 인젝션 치트 시트 (위 참조)를 자세히 읽으십시오.

10
Justin Clarke

웹 응용 프로그램을 SQL 주입으로부터 보호하는 주요 단계는 모든 사용자 입력을 적절하게 위생 처리 (특히 SQL 쿼리에 사용되는 입력)입니다. 일부 언어/프레임 워크에는 이러한 값을 처리하는 표준 방법이 있습니다 (예 : 문자열 값을 조인하여 쿼리를 구성하는 대신 parameterized queries 사용).

9
bretik

폴리 테크닉에서 IT 보안을 가르치고 있습니다. 종종 학생들에게는 SQL 주입에 사용되는 용어에 대해 약간의 혼동이 있으므로 명확하게 설명하겠습니다.

Facebook과 같은 웹 애플리케이션의 맥락에서

SQL 주입은 일반 웹 사용자가 데이터 필드에 SQL 코드를 입력하는 경우입니다.

 ' OR '1'='1 into the textboxes of a login form.

SQL 삽입을 방지하는 가장 좋은 사람은 웹 개발자가 웹 응용 프로그램의 데이터베이스에서 데이터를 읽고 쓰는 코드를 작성하는 사람입니다.

웹 개발자가 SQL 삽입을 방지하는 가장 쉬운 방법은 매개 변수화 된 쿼리를 사용하는 것입니다.

준비된 문장과 매개 변수화 된 쿼리는 같은 의미입니다.

이 시점부터 매개 변수화 된 쿼리를 사용해야합니다.

매개 변수화 된 쿼리는 SQL 코드가 처음 정의 된 방식을 참조한 다음 데이터가 적절한 매개 변수 안에 배치됩니다.

예 : .Net

Update `users` set `name` = @name where `id` = @id

매개 변수 @name 및 @id는 데이터입니다. 나머지는 SQL 코드입니다.

매개 변수화 된 쿼리는 보통은 아니지만 항상 웹 응용 프로그램 코드에서 수행됩니다.

매개 변수화 된 쿼리를 작성하는 일반적인 두 가지 방법이 있습니다.

  1. 사용 된 언어에 따라 웹 애플리케이션 코드에서
  2. 저장 프로 시저를 사용하는 데이터베이스에서

어떤 의미에서, 저장 프로시 저는 매개 변수화 된 쿼리 형식입니다.

작은 따옴표와 같은 특수 문자를 이스케이프 처리하여 SQL 삽입을 방지하는 다른 방법이 있습니다. 예를 들어, PHP에서는 기본적으로 작은 따옴표 앞에 슬래시를 넣는 mysql_real_escape_string을 사용할 수 있습니다.

이것은 MySQL과 같은 특정 데이터베이스에서 LIKE 연산자에 대한 % 및 밑줄 문제로 인해 이상적이지 않습니다. 자세한 내용은 this pdf 를 참조하십시오.

간단히 말해서 제안 된 모든 옵션은 SQL 코드를 정리하기 위해 사용자 입력을 정리 (정리)하는 것과 관련이 있습니다.

가장 좋은 방법은 사용 된 프로그래밍 언어에 따라 매개 변수화 된 쿼리를 사용하는 것입니다.

이야기의 끝.

4
Kim Stacks

웹 개발자 측면에서 Weber가 이미 언급 한 내용에주의를 기울여야합니다.

또한 GreenSQL과 같은 데이터베이스 방화벽을 설정할 수 있습니다 : http://www.greensql.net/ . 응용 프로그램과 사용자 입력 사이의 프록시처럼 작동하고 통과해야 할 내용을 감시하는 등의 작업을 수행합니다. 그러나 응답 시간이 길어집니다.

4
anonymous

올바른 데이터 액세스 API를 사용하면 올바른 작업을 쉽고 안전하게 수행 할 수 있습니다.

ActiveRecord v3는 다음과 같습니다.

# basic usage
@user = User.where(:username => '[email protected]').first

# with a SQL-string fragment, but using parameters
@projects = @user.projects.where('status = ?', params[:status])
3
yfeldblum