복붙노트

[SQL] 작은 따옴표로 묶인 변수에 SQL 주입을 방지하기 위해 반드시 htmlspecialchars의 부족인가?

SQL

작은 따옴표로 묶인 변수에 SQL 주입을 방지하기 위해 반드시 htmlspecialchars의 부족인가?

많은 소스는 ENT_QUOTES가 SQL 주입을 방지하는 것만으로는 충분하지 수와 반드시 htmlspecialchars이 기능을 인용하지만, 그들 중 누구도 개념의 증거를 제공하지 않습니다. 나는 어떤 가능성에 자신을 생각할 수 없다.

우리는 다음의 예를 살펴 보자 :

$username = htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
$sql = "SELECT * from user WHERE name='$username'";
mysql_query($sql,...);

하나는 SQL 주입 주위는 mysql_real_escape_string 도착 때 경우에 포함 이외의 예를 제공 할 수 있습니다 ()?

해결법

  1. ==============================

    1.반드시 htmlspecialchars가 임계 문자 \ 0 (NUL 바이트) \ B (백 스페이스)뿐만 아니라 \ 문자를 인코딩하는데 실패하는 캐릭터.

    반드시 htmlspecialchars가 임계 문자 \ 0 (NUL 바이트) \ B (백 스페이스)뿐만 아니라 \ 문자를 인코딩하는데 실패하는 캐릭터.

    이를 이용하기 위해서는 여러 주입 지점과 함께 문이 필요합니다. 이 사용하면 하나의 문자열 리터럴의 닫는 구분 기호를 탈출 할 수 있으므로 다음 문자열 리터럴의 다음 시작 구분 기호로까지 확장합니다. 주입 지점 세 리터럴 스트링 각각은 두 리터럴 스트링으로 변환 될 수있다.

    예를 들면 :

    SELECT * from user WHERE (name='$login' OR email='$login') AND password='$password'
    

    이제 다음과 같은 값 :

    login:    ) OR 1=1 /*\
    password: */--
    

    그 결과 문은 다음과 같습니다 :

    SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1 /*\') AND password='*/--'
    

    어떤 동일합니다 :

    SELECT * from user WHERE (name=') OR 1=1 /*\' OR email=') OR 1=1
    
  2. ==============================

    2.문자열을 가진 유일한 것은 SQL의 상호 작용하지 않습니다.

    문자열을 가진 유일한 것은 SQL의 상호 작용하지 않습니다.

    $result = "SELECT * FROM user WHERE id = " . htmlspecialchars($_GET['id']);
    

    매개 변수가있는 쿼리가 매우 편리 곳이다.

  3. from https://stackoverflow.com/questions/22116934/is-htmlspecialchars-enough-to-prevent-an-sql-injection-on-a-variable-enclosed-in by cc-by-sa and MIT license