source

DB에 연결하지 않고 mysql_real_escape_string 대신 사용할 수 있습니다.

nicesource 2022. 10. 25. 17:38
반응형

DB에 연결하지 않고 mysql_real_escape_string 대신 사용할 수 있습니다.

DB접속 없이 드라이테스트를 해야 하는 경우가 있기 때문에 데이터베이스에 접속하지 않고 mysql_real_escape_string으로 기능하도록 하고 싶습니다.mysql_escape_string은 권장되지 않으므로 바람직하지 않습니다.조사 결과:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

DB 연결 없이 문자열을 안전하게 이스케이프하는 것은 불가능합니다. mysql_real_escape_string()준비된 문장은 적절한 문자 집합을 사용하여 문자열을 이스케이프할 수 있도록 데이터베이스에 연결해야 합니다.그렇지 않으면 멀티바이트 문자를 사용하여 SQL 주입 공격이 발생할 수 있습니다.

테스트만 하는 경우에는 다음 명령을 사용하는 것이 좋습니다.mysql_escape_string()SQL 주입 공격에 대해 100% 보장되는 것은 아니지만 DB 연결 없이는 더 안전한 것을 구축할 수 없습니다.

mysql_real_escape_string 함수 참조 페이지에 따르면:mysql_real_escape_string()은 MySQL 라이브러리 함수 mysql_real_escape_string을 호출합니다.이 함수는 \x00, \n, \r, \r, \, ', " 및 \x1a 문자를 이스케이프합니다.

이 점을 염두에 두고 게시한 두 번째 링크에 표시된 함수는 필요한 기능을 수행합니다.

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}

다른 답변과는 정반대로, 이 기능은 멀티바이트 문자를 사용하더라도 안전할 수 있습니다.

// replace any non-ascii character with its hex code.
function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

저보다 더 박식한 사람이 왜 위의 코드가 작동하지 않는지 설명해 주셨으면 합니다.

추가 조사를 통해 다음과 같은 사실을 알게 되었습니다.

http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html

보안 수정:

멀티바이트 인코딩 처리에서 SQL 주입 보안 구멍이 발견되었습니다.서버에 오류가 발생하여 mysql_real_escape_string() C API 함수로 이스케이프된 문자열을 잘못 해석했습니다.

이 취약성은 OSDB 컨소시엄의 프로젝트 간 보안 협업의 일환으로 Josh Berkus와 Tom Lane에 의해 발견되어 보고되었습니다.SQL 주입에 대한 자세한 내용은 다음 텍스트를 참조하십시오.

논의.멀티바이트 인코딩 처리에서 SQL 주입 보안 구멍이 발견되었습니다.SQL 주입 보안 구멍에는 사용자가 데이터베이스에 삽입할 데이터를 제공할 때 사용자가 SQL 문을 서버가 실행하는 데이터에 주입할 수 있는 상황이 포함될 수 있습니다.이 취약성에 대해 문자 집합 비대응 이스케이프를 사용하면(예를 들어 PHP의 addslash()), 일부 멀티바이트 문자 집합(예를 들어 SJIS, BIG5, GBK)에서 이스케이프를 바이패스할 수 있습니다.그 결과 addslash() 등의 함수는 SQL 주입 공격을 방지할 수 없습니다.서버측에서는 이 문제를 해결할 수 없습니다.최적의 솔루션은 mysql_real_escape_string() 등의 함수에 의해 제공되는 문자 집합 인식 이스케이프를 사용하는 것입니다.

단, MySQL 서버가 mysql_real_escape_string()의 출력을 해석하는 방법에서 오류가 검출되었습니다.그 결과 문자 집합 인식 함수 mysql_real_escape_string()을 사용해도 SQL 주입이 가능했습니다.이 버그는 수정되었습니다.

회피책MySQL을 mysql_real_escape_string() 구문 분석에 오류 수정이 포함된 버전으로 업그레이드할 수 없지만 MySQL 5.0.1 이후를 실행하는 경우 회피책으로 NO_BACKSLASH_ESCAPES SQL 모드를 사용할 수 있습니다.(이 모드는 MySQL 5.0.1에서 도입되었습니다).NO_BACKSLASH_ESCAPES는 SQL 표준 호환성 모드를 이노블로 합니다.이 모드에서는 백슬래시는 특수 문자로 간주되지 않습니다.그 결과 쿼리는 실패합니다.

현재 연결에 대해 이 모드를 설정하려면 다음 SQL 문을 입력합니다.

SET sql_mode='NO_BACKSLASH_ESCAPES';

또, 모든 클라이언트에 대해서 글로벌하게 모드를 설정할 수도 있습니다.

SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';

이 SQL 모드는 명령줄 옵션 --sql-mode=를 사용하여 서버를 시작할 때 자동으로 활성화할 수도 있습니다.NO_BACKSLASH_ESCAPES 또는 sql-mode= 설정서버 옵션파일의 NO_BACKSLASH_ESCAPES(시스템에 따라 my.cnf 또는 my.ini 등)(버그 #8378, CVE-2006-2753)

「Bug #8303」도 참조해 주세요.

언급URL : https://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db

반응형