복붙노트

PHP : mysql_real_escape_string은 사용자 입력을 청소하기에 충분합니까?

PHP

PHP : mysql_real_escape_string은 사용자 입력을 청소하기에 충분합니까?

mysql_real_escape_string은 대부분의 상황에서 사용자 입력을 청소하기에 충분합니까?

::편집하다::

나는 대부분 SQL 주입을 막는 것을 생각하고 있지만 궁극적으로는 mysql_real_escape_string을 적용한 후에 사용자 데이터를 신뢰할 수 있는지 또는 응용 프로그램과 데이터베이스를 전달하기 전에 데이터를 정리하는 추가 조치를 취해야 하는지를 알고 싶습니다.

HTML 문자를 정리하는 것이 중요하지만 사용자 입력을 신뢰하는 데는 필요하지 않다고 생각합니다.

해결법

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

    1.mysql_real_escape_string은 모든 상황에서 충분하지는 않지만 확실히 좋은 친구입니다. 더 나은 해결책은 Prepared Statements를 사용하는 것입니다.

    mysql_real_escape_string은 모든 상황에서 충분하지는 않지만 확실히 좋은 친구입니다. 더 나은 해결책은 Prepared Statements를 사용하는 것입니다.

    //example from http://php.net/manual/en/pdo.prepared-statements.php
    
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $value);
    
    // insert one row
    $name = 'one';
    $value = 1;
    $stmt->execute();
    

    또한 유효하지 않은 / 의심스러운 문자를 버리는 데 사용할 수있는 HTMLPurifier를 잊지 마십시오.

    ...........

    편집하다: 아래의 의견을 바탕으로이 링크를 게시해야합니다 (혼란을 일으키기 전에 미안 했어야 함).

    mysql_real_escape_string ()과 Prepared Statements

    인용 :

    Chris Shiflett (보안 전문가)

  2. ==============================

    2.귀하의 질문에 대한 대답은 아니오입니다. mysql_real_escape_string ()은 모든 사용자 입력에 적합하지 않으며 mysql_real_escape_string ()은 모든 SQL 주입을 중지하지 않습니다. addslashes ()는 PHP에서 사용하는 또 다른 인기있는 함수이며, 동일한 문제가 있습니다.

    귀하의 질문에 대한 대답은 아니오입니다. mysql_real_escape_string ()은 모든 사용자 입력에 적합하지 않으며 mysql_real_escape_string ()은 모든 SQL 주입을 중지하지 않습니다. addslashes ()는 PHP에서 사용하는 또 다른 인기있는 함수이며, 동일한 문제가 있습니다.

    취약한 코드 :

    mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));
    

    작은 악용 :

    http://localhost/sql_test.php?id=1 or sleep(500)
    

    이 패치는 id 주위에 따옴표를 사용합니다 :

    mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");
    

    실제로 가장 좋은 방법은 많은 사람들이 지적한 매개 변수화 된 쿼리를 사용하는 것입니다. Pdo는 잘 작동하고, adodb는 PHP에서 또 다른 인기있는 라이브러리입니다.

    mysql_real_escape_string을 사용하면 SQL 주입에만 사용해야하며 그 밖의 것은 사용하지 말아야한다. 취약점은 데이터 사용 방법에 따라 크게 다릅니다. 기능별 보안 조치를 기능별로 적용해야합니다. 그리고 예, XSS는 매우 심각한 문제입니다. html 필터링은 심각한 해커가 pw3n을 사용하는 실수입니다. xss faq을 읽으십시오.

  3. ==============================

    3.데이터베이스에, 예. 출력을 위해 적절히 이스케이프 / 인코딩 데이터를 고려하는 것이 좋습니다.

    데이터베이스에, 예. 출력을 위해 적절히 이스케이프 / 인코딩 데이터를 고려하는 것이 좋습니다.

    또한 입력 내용이 예상 한 것과 비교하여 유효성을 검증하는 것도 고려해야합니다.

    준비된 진술 사용을 고려 했습니까? PHP는 데이터베이스와 상호 작용할 수있는 다양한 방법을 제공합니다. 대부분은 mysql_ * 함수보다 낫다.

    PDO, MDB2 및 MySQL Improved를 시작해야합니다.

  4. ==============================

    4.어떤 상황입니까?

    어떤 상황입니까?

    SQL 쿼리의 경우 훌륭합니다. (준비된 문장이 더 좋다 - PDO에 대해이 투표를한다.하지만 함수는 정상적으로 이스케이프 처리한다.) HTML과 같은 경우, HTML은 일을위한 도구가 아니다. 일반적인 htmlspecialchars 나 HTML Purifier와 같은보다 정밀한 도구를 사용해 보라.

    편집을 처리하려면 추가 할 수있는 다른 레이어는 데이터 값입니다 (예 : 데이터베이스에 정수를 넣고 양의 정수가 필요하면 음의 정수를 넣으려고하면 사용자에게 오류를 반환하는지 확인하십시오. 데이터 무결성에 관한 한, mysql_real_escape_string은 당신이 이스케이프 (escaping) 할 때 가장 좋습니다 (그러나 prepared statement는 완전한 이스케이프를 피하는 더 깨끗한 시스템입니다).

  5. ==============================

    5.mysql_real_escape_string ()은 SQL 삽입 공격 만 방지하는데 유용합니다. 그것은 사이트 간 스크립팅 공격을 막는 데 도움이되지 않습니다. 이를 위해서는 원래 사용자 입력에서 수집 된 데이터를 출력하기 직전에 htmlspecialchars ()를 사용해야합니다.

    mysql_real_escape_string ()은 SQL 삽입 공격 만 방지하는데 유용합니다. 그것은 사이트 간 스크립팅 공격을 막는 데 도움이되지 않습니다. 이를 위해서는 원래 사용자 입력에서 수집 된 데이터를 출력하기 직전에 htmlspecialchars ()를 사용해야합니다.

  6. ==============================

    6.두 가지 방법이 있습니다. 하나는 준비된 문장을 사용하는 것입니다 (다른 답변에서 언급했듯이). 이제는 데이터베이스 대신 두 가지 요청을 보내야하기 때문에 앱 속도가 느려집니다. 당신이 감소 된 성과로 살 수 있다면, 그것을 위해 가십시오; Prepared Statements를 사용하면 코드를 더 예쁘고 쉽게 처리 할 수 ​​있습니다.

    두 가지 방법이 있습니다. 하나는 준비된 문장을 사용하는 것입니다 (다른 답변에서 언급했듯이). 이제는 데이터베이스 대신 두 가지 요청을 보내야하기 때문에 앱 속도가 느려집니다. 당신이 감소 된 성과로 살 수 있다면, 그것을 위해 가십시오; Prepared Statements를 사용하면 코드를 더 예쁘고 쉽게 처리 할 수 ​​있습니다.

    mysql_real_escape_string을 사용하기로 결정했다면, 신뢰할 수없는 모든 문자열을 이스케이프해야합니다. 이스케이프 된 (mysql_real_escape_string) 문자열은 SQL Injection secure입니다. 모든 문자열을 벗어나지 않으면 보안되지 않습니다. 실제로 mysql_real_escape_string을 입력 유효성 검사와 결합해야합니다. 숫자를 보유 할 것으로 예상되는 변수가 실제로 숫자이고 예상 범위 내에 있는지 확인하십시오. 사용자를 신뢰하지 마십시오.

  7. ==============================

    7."청소"에는 여러 가지 유형이 있습니다.

    "청소"에는 여러 가지 유형이 있습니다.

    mysql_real_escape_string은 데이터베이스 데이터로는 충분하지만 HTML 인 경우에는 브라우저가 표시 할 때 여전히 평가됩니다.

    사용자 입력에서 HTML을 제거하려면 strip_tags를 사용할 수 있습니다.

    준비된 구문을 바로 지원하기 때문에 정기적 인 MySQL 대신 PDO를 사용하는 것이 좋을 것입니다. 그리고 잘못된 데이터를 이스케이프 처리합니다.

  8. ==============================

    8.두 가지 방법을 시도해 볼 수 있습니다.

    두 가지 방법을 시도해 볼 수 있습니다.

    function clean_input($instr) {
    
         // Note that PHP performs addslashes() on GET/POST data.
         // Avoid double escaping by checking the setting before doing this.
        if(get_magic_quotes_gpc()) {
            $str = stripslashes($instr);
        }
        return mysql_real_escape_string(strip_tags(trim($instr)));
    }
    
  9. ==============================

    9.가장 좋은 방법은 Prepared Statements를 사용하는 것입니다.

    가장 좋은 방법은 Prepared Statements를 사용하는 것입니다.

  10. ==============================

    10.필자는 PHP 5.2+에 다양한 방법으로 사용자 입력을 위생 할 수있는 입력 필터 함수가 있다고 덧붙였습니다.

    필자는 PHP 5.2+에 다양한 방법으로 사용자 입력을 위생 할 수있는 입력 필터 함수가 있다고 덧붙였습니다.

    다음은 수동 입력뿐 아니라 [Matt Butcher의 블로그 게시물]이 훌륭한 이유입니다.

  11. from https://stackoverflow.com/questions/2353666/php-is-mysql-real-escape-string-sufficient-for-cleaning-user-input by cc-by-sa and MIT license