MySQL 와일드카드 탈출
사용 중인 이전 서버에서는 준비된 문을 사용할 수 없습니다. MySQL로 전송하기 전에 사용자 입력을 완전히 제거하려고 합니다.이를 위해 PHP 기능을 사용하고 있습니다.mysql_real_escape_string
.
이 함수는 MySQL 와일드카드 % 및 _을(를) 벗어나지 않기 때문에addcslashes
이것들을 탈출하기 위해서도.
다음과 같은 내용을 보낼 때:
test_test " '
데이터베이스로 보낸 후 다시 읽어보면 데이터베이스에 다음이 표시됩니다.
test\_test " '
이것을 보면 저는 왜 _ 은 앞에 백슬래시가 있는데 " 와 " 하지 않는 지 이해할 수 없습니다.이들은 모두 \certure _ 및 "로 이스케이프되므로 모두 동일하게 나타나야 합니다. 즉, 모두 이스케이프 문자가 보이거나 모두 보이지 않아야 합니다.
탈출하는 \s는 다음에 대해 자동으로 선별됩니다.
누가 설명해 줄 수 있습니까?
_
그리고.%
는 일반적으로 MySQL의 와일드카드가 아니며, 정상적인 문자열 리터럴에 넣을 목적으로 이스케이프되지 않아야 합니다.mysql_real_escape_string
이 목적에 적합하고 충분합니다.addcslashes
사용해서는 안 됩니다.
_
그리고.%
오직 의 맥락에서만 특별합니다.LIKE
matching.에서 문자 그대로 사용할 문자열을 준비하려는 경우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 |