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
'programing' 카테고리의 다른 글
| docker. sock 권한이 거부되었습니다. (0) | 2023.10.10 |
|---|---|
| csc.exe 파일이 포함된 smarterasp.net 에 웹사이트를 게시하는 데 문제가 있습니까? (0) | 2023.10.10 |
| 라라벨 웹사이트에서 테마 옵션을 구현하는 방법은? (0) | 2023.10.10 |
| 쿼리 마우스 입력() vs 마우스 오버() (0) | 2023.10.10 |
| 당신은 오른쪽 시프트가 C에서 무엇을 채우는지 조절할 수 있습니까? (0) | 2023.10.10 |