2009-11-28 5 views
2

I가 요청하는 다른 스크립트를 가져와 이것이 내가 사용자 입력 소독을 쓴 하나 "이동"스크립트 : 나는 다른 사람 사용이 접근을 보지 못했다PHP/MYSQL : 사용자 입력을 살균하는 것은 좋지 않은 생각입니까?

foreach ($_REQUEST as $key => $value){ 
    if (get_magic_quotes_gpc()) 
    $_REQUEST[$key] = mysql_real_escape_string(stripslashes($value)); 
    else 
    $_REQUEST[$key] = mysql_real_escape_string($value); 
} 

합니다. 거기에 어떤 이유가 없습니까?

편집 - 개정 된 배열을 위해 일하기 :

function mysql_escape($thing) { 
    if (is_array($thing)) { 
    $escaped = array(); 
    foreach ($thing as $key => $value) { 
     $escaped[$key] = mysql_escape($value); 
    }   
    return $escaped; 
    } 
    // else 
    if (get_magic_quotes_gpc()) $thing = stripslashes($thing); 
    return mysql_real_escape_string($thing); 
} 

foreach ($_REQUEST as $key => $value){ 
    $_REQUEST[$key] = mysql_escape($value); 
} 

답변

9

내가 훨씬 더 잘가하지의 방법에 사용되는 시간에 데이터를 탈출 찾기가 해당 데이터를 사용할 수도 있습니다. JSON, XML, Shell, MySQL, Curl 또는 HTML 등으로 구성되며 각각은 자체 탈출 방식을 사용합니다. 당신이 따옴표로 구분 된 문자열에있는 경우

, 당신은 따옴표를 탈출 할 수 있어야합니다 :


는 이스케이프 서로 다른 상황에서 필요한 이유의 빠른 검토를 할 수 있습니다. xml을 사용하는 경우 "내용"과 "마크 업"을 구분해야합니다. SQL을 사용하는 경우 "데이터"와 "명령"을 분리해야합니다. 명령 행을 사용하는 경우, "명령"에서 "데이터"

이것은 일반적으로 컴퓨팅의 정말로 기본적인 부분입니다. 데이터를 구분하는 구문이 데이터에서 발생할 수 있기 때문에 SYNTAX와 DATA를 구분하여 이스케이프 할 수있는 방법이 필요합니다. 웹 프로그래밍에서

, 일반적인 탈출의 경우는 다음과 같습니다 HTML로 HTML 2. 출력하기 데이터로 1. 출력하기 텍스트는 5. 데이터 삽입 SQL에 자바 스크립트로 HTML 4. 삽입 데이터로 3. 출력하기 HTML 속성 6. 셸 명령에 데이터 삽입

잘못 처리하면 각기 다른 보안 관련 사항이 있습니다. 이것은 매우 중요합니다!

  • (... ENT_QUOTES를) 반드시 htmlspecialchars (...) HTML로

  • 데이터 반드시 htmlspecialchars 속성 : HTML로

    1. 텍스트 : 이제 PHP의 맥락에서이 문제를 검토하자 HTML을 HTML로 유효한 태그 만 존재하는지 확인하려면 HTMLPurifier과 같은 라이브러리를 사용하십시오.

    2. 데이터를 자바 스크립트 json_encode을 선호합니다. 특성에 배치하는 경우 여전히

    3. 과 같이 2를 사용해야합니다. SQL에 데이터 삽입 각 드라이버에는 일종의 escape() 함수가 있습니다. 그것은 최고입니다. 일반적인 latin1 문자 세트로 실행하면 addslashes (...)가 적합합니다. addslashes() 호출의 따옴표를 잊지 마십시오 :

      "INSERT INTO table1 SET field1 = '". addslashes ($ 데이터)." '"

    4. 명령 줄 escapeshellarg의 데이터()와()에는 escapeshellcmd - 마음이를 가지고, 당신은 공통의 95 % *를 제거합니다 - 수동

    읽기 웹 보안 위험! (* 추측)

  • +0

    불행하게도, 내 문자 집합이 UTF-8이고 라틴 문자에 국한되지. 나는 모든 것을 적절하게 이스케이프 처리하도록하지만, SQL 인젝션을 열어두고 지나치게 편집증 적이라는 것을 알았습니다. – Greg

    +0

    mysql_real_escape_characters는 데이터베이스로 들어가는 사용자 입력을 위생 처리하는 더 좋은 옵션입니다. – Residuum

    +0

    @Residuum : 매뉴얼에서 찾을 수없는 것 같습니다. – Greg

    2

    사용자의 접근 방식은 모든 요청 데이터를 데이터베이스에 삽입하기 위해 위생적으로 시도하지만, 방금 출력하려고하면 어떻게됩니까? 출력에 불필요한 백 슬래시가 생깁니다. 또한 탈출은 어쨌든 SQL 예외로부터 보호하는 좋은 전략이 아닙니다. 매개 변수가있는 쿼리 (예 : PDO 또는 MySQLi)를 사용하면 추상화 레이어로 이스케이프 문제를 "전달"합니다.

    3

    배열에 $_REQUEST이 있으면 그 값은 새 니타 이징되지 않습니다.

    +1

    +1. 재귀 적 위생 처리가 필요합니다. – mauris

    +0

    지적 해 주셔서 고맙습니다. 나는 나의 질문을 편집했다. – Greg

    2

    배열로의 재귀 부족과 불필요한 정수의 이스케이프 외에도이 접근법은 위생 처리 전에 SQL 문에서 사용할 데이터를 인코딩합니다. mysql_real_escape_string() 데이터를 이스케이프 처리하고 위생적으로 삭제하지 않습니다. 이스케이프 처리 및 위생 처리는 동일한 작업이 아닙니다.

    sanitization은 많은 PHP 스크립트가 입력 데이터를 사용하기 전에 입력 데이터를 조사하는 작업입니다. 나는 이것이 탈출되지 않은 데이터에 대해 더 잘 수행되었다고 생각한다. 나는 일반적으로 SQL에 들어갈 때까지 데이터를 빠져 나가지 못한다. Prepared Statements을 선호하는 사람들도 이와 같은 방식으로 성취합니다.

    한 가지 더 : 입력 데이터에 utf8 문자열을 포함 할 수 있다면 이스케이프 전에 유효성을 검사해야합니다. 나는 종종 위생 처리 (sanitization) 전에 $ _POST에 재귀 utf8 클리너를 사용한다.

    3

    내가 만들었이 하나를 사용

    <?php 
    function _clean($var){ 
        $pattern = array("/0x27/","/%0a/","/%0A/","/%0d/","/%0D/","/0x3a/", 
            "/union/i","/concat/i","/delete/i","/truncate/i","/alter/i","/information_schema/i", 
            "/unhex/i","/load_file/i","/outfile/i","/0xbf27/"); 
        $value = addslashes(preg_replace($pattern, "", $var)); 
        return $value; 
    } 
    
    if(isset($_GET)){ 
        foreach($_GET as $k => $v){ 
         $_GET[$k] = _clean($v); 
        } 
    } 
    
    if(isset($_POST)){ 
        foreach($_POST as $k => $v){ 
         $_POST[$k] = _clean($v); 
        } 
    } 
    ?>