programing

MySQL 와일드카드 탈출

powerit 2023. 10. 10. 21:15
반응형

MySQL 와일드카드 탈출

사용 중인 이전 서버에서는 준비된 문을 사용할 수 없습니다. MySQL로 전송하기 전에 사용자 입력을 완전히 제거하려고 합니다.이를 위해 PHP 기능을 사용하고 있습니다.mysql_real_escape_string.

이 함수는 MySQL 와일드카드 % 및 _을(를) 벗어나지 않기 때문에addcslashes이것들을 탈출하기 위해서도.

다음과 같은 내용을 보낼 때:

test_test " ' 

데이터베이스로 보낸 후 다시 읽어보면 데이터베이스에 다음이 표시됩니다.

test\_test " ' 

이것을 보면 저는 왜 _ 은 앞에 백슬래시가 있는데 " 와 " 하지 않는 지 이해할 수 없습니다.이들은 모두 \certure _ 및 "로 이스케이프되므로 모두 동일하게 나타나야 합니다. 즉, 모두 이스케이프 문자가 보이거나 모두 보이지 않아야 합니다.

탈출하는 \s는 다음에 대해 자동으로 선별됩니다.

누가 설명해 줄 수 있습니까?

_그리고.%는 일반적으로 MySQL의 와일드카드가 아니며, 정상적인 문자열 리터럴에 넣을 목적으로 이스케이프되지 않아야 합니다.mysql_real_escape_string이 목적에 적합하고 충분합니다.addcslashes사용해서는 안 됩니다.

_그리고.%오직 의 맥락에서만 특별합니다.LIKEmatching.에서 문자 그대로 사용할 문자열을 준비하려는 경우LIKE이렇게 진술합니다.100%100% 일치합니다. 100부터 시작하는 문자열뿐만 아니라 두 단계의 탈출에 대해 걱정해야 합니다.

첫 번째는 탈출하는 것과 같습니다.LIKE 처리는 전적으로 SQL 내부에서 이루어지며, 리터럴 문자열을 리터럴 LIKE 식으로 변환하려면 매개 변수화된 쿼리를 사용하는 경우에도 이 단계를 수행해야 합니다!

이 계획에서,_그리고.%특별하고 탈출해야 합니다탈출 캐릭터도 탈출해야 합니다.ANSI SQL에 따르면 다음 문자 이외의 문자는 이스케이프해서는 안 됩니다.\'틀릴 겁니다. (MySQL을 사용하면 일반적으로 벗어날 수 있습니다.)

이 작업을 수행하면 두 번째 탈출 단계로 진행합니다. 두 번째 탈출 단계는 기존 문자열의 문자 그대로 탈출입니다.이 작업은 SQL 외부에서 수행되어 SQL을 생성하므로 LIKE 탈출 단계 후에 수행해야 합니다.MySQL의 경우, 이것은mysql_real_escape_string이전과 마찬가지로, 다른 데이터베이스의 경우에는 다른 기능이 있습니다. 매개 변수화된 쿼리를 사용하여 필요를 방지할 수 있습니다.

여기서 혼란을 초래하는 문제는 MySQL에서 중첩 탈출 단계 모두에 대해 백슬래시를 탈출 문자로 사용한다는 것입니다!따라서 문자열을 문자 그대로의 백분율 기호와 일치시키려면 슬래시 탈출을 이중으로 되돌리고 다음과 같이 말해야 합니다.LIKE 'something\\%'에요. , PHP."럴,"LIKE 'something\\\\%'" 으악!

'' LIKE 식에는 기본적으로 이스케이프 문자가 전혀 없습니다.

하려면 LIKE-Escape 를() LIKE ... ESCAPE ...건설하다, 말고 제정신이라면 백슬래시 말고 다른 걸 골라야겠어요!

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

$escapedname= mysql_real_escape_string(like($name, '='));
$query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

또는 매개변수(예: PDO)를 사용하여:

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

및 수도 SQL Server Sybase 를).[,하게는,합니다에서 LIKE탈출해야 하는 진술서입니다.으으으으으으으으으으으으으으으으으으으)

)이foo%baz 내 엔), INSTR/LOCATE/POSITION,LEFT,RIGHT.LIKE예어,치)의 어느 에나 일치합니다%foobar% 난 후), LIKE턴을 INSTR대신.

value LIKE '%foobar%'치):

INSTR(value, 'foobar') > 0

value LIKE 'foobar%' 시 치):

INSTR(value, 'foobar') = 1

value LIKE '%foobar'치):

RIGHT(value, 6) = 'foobar'

단순하고 기억하기 쉽지 않을 수도 있으며, 마지막에 매칭하는 솔루션은 보다 보편적으로 사용할 수 있도록 개선될 수도 있습니다.그러나 이러한 대안은 적어도 보안 측면에서 마음의 안정을 줄 수 있기를 바랍니다. 이는 자체적으로 롤드된 탈출의 필요성을 우회하고 실제 매개 변수 값을 변경할 필요가 없기 때문입니다(어쨌든 준비된 진술을 사용할 때).

언급URL : https://stackoverflow.com/questions/3683746/escaping-mysql-wild-cards

반응형