문제

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, ,"및 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 함수로 탈출 한 문자열을 잘못 구문 분석했습니다.

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

논의. 다중 바이트 인코딩 처리에서 SQL 주입 보안 구멍이 발견되었습니다. SQL 주입 보안 구멍에는 사용자가 데이터베이스에 삽입 할 데이터를 제공 할 때 사용자가 서버가 실행하는 데이터에 SQL 문을 주입 할 수있는 상황이 포함될 수 있습니다. 이 취약점과 관련하여, 캐릭터 세트 노동도 탈출이 사용될 때 (예 : PHP의 addSlashes ())는 일부 다중 바이트 문자 세트 (예 : SJIS, BIG5 및 GBK)에서 이스케이프를 우회 할 수 있습니다. 결과적으로 AddSlashes ()와 같은 함수는 SQL 주입 공격을 방지 할 수 없습니다. 서버 측에서 이것을 고치는 것은 불가능합니다. 최상의 솔루션은 응용 프로그램이 MySQL_REAL_ESCAPE_STRING ()와 같은 기능에 의해 제공되는 문자 세트 인식 탈출을 사용하는 것입니다.

그러나 MySQL 서버가 MySQL_Real_escape_string ()의 출력을 구문 분석하는 방법에 대한 버그가 감지되었습니다. 결과적으로, 문자 세트 인식 기능 MySQL_Real_escape_string ()이 사용 된 경우에도 SQL 주입이 가능했습니다. 이 버그는 고정되었습니다.

해결 방법. mysql_real_escape_string () 파싱의 버그에 대한 수정이 포함 된 버전으로 mysql을 업그레이드 할 수 없지만 mysql 5.0.1 이상을 실행하면 no_backslash_escapes sql mode를 해결 방법으로 사용할 수 있습니다. (이 모드는 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)

버그#8303도 참조하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top