programing tip

PHP : mysql_real_escape_string이 사용자 입력을 정리하기에 충분합니까?

itbloger 2020. 12. 13. 09:01
반응형

PHP : mysql_real_escape_string이 사용자 입력을 정리하기에 충분합니까?


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

::편집하다::

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

HTML 문자 정리가 중요한 부분을 알지만 사용자 입력을 신뢰하는 데 필요하다고 생각하지 않습니다.


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 () 대 준비된 문

인용 :

mysql_real_escape_string ()은 addlash ()에 영향을 미치는 동일한 종류의 문제가 발생하기 쉽습니다.

Chris Shiflett (보안 전문가)


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

취약한 코드 :

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

poc 익스플로잇 :

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를 읽어보십시오 .


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

또한 입력이 예상되는 것과 비교하여 입력의 유효성을 검사 해야 합니다.

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

PDO , MDB2MySQL Improved 가 시작됩니다.


어떤 상황?

SQL 쿼리의 경우 훌륭합니다. (준비된 진술이 더 낫습니다. PDO투표 하지만 함수는 잘 빠져 나갑니다.) HTML 등의 경우 작업 도구가 아닙니다. 일반적인 htmlspecialchars도구 나 HTML Purifier 와 같은 더 정확한 도구를 사용해보십시오 .

편집을 해결하려면 : 추가 할 수있는 유일한 다른 레이어는 데이터 유효성 검사입니다. 예를 들어 데이터베이스에 정수를 입력하고 양의 정수를 예상하는 경우 사용자에게 오류를 반환하는지 확인합니다. 음의 정수. 데이터 무결성에 관한 한, mysql_real_escape_string이스케이프를위한 최선의 방법입니다 (하지만 준비된 명령문은 완전히 이스케이프를 피하는 더 깨끗한 시스템 임).


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


두 가지 방법이 있습니다. 하나는 준비된 문을 사용하는 것입니다 (다른 답변에서 언급했듯이).하지만 이제 하나가 아닌 두 개의 요청을 데이터베이스에 보내야하기 때문에 앱 속도가 느려집니다. 감소 된 성능으로 살 수 있다면 그것을 위해 가십시오. Prepared Statements는 코드를 더 예쁘고 다루기 쉽게 만듭니다.

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


There are different types of "cleaning".

mysql_real_escape_string is sufficient for database data, but will still be evaluated by the browser upon display if it is HTML.

To remove HTML from user input, you can use strip_tags.

I would suggest you look into using PDO instead of regular MySQL stuff, as it supports prepared statements right out of the box, and those handle the escaping of invalid data for you.


You can try both, as in

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)));
}

The best way to go would be to use Prepared Statements


I thought I'd add that PHP 5.2+ has input filter functions that can sanitize user input in a variety of ways.

Here's the manual entry as well as a blog post [by Matt Butcher] about why they're great.

참고URL : https://stackoverflow.com/questions/2353666/php-is-mysql-real-escape-string-sufficient-for-cleaning-user-input

반응형