mysql_real_escape_string 및 단일 견적
-
05-07-2019 - |
문제
나는 꽤 좌절했다. 예를 들어 O'Connor와 같은 단일 따옴표로 데이터베이스 이름에 삽입 할 수 있기를 원합니다.
따라서 DB에 삽입 할 때 다음을 수행합니다.
$lname = mysql_real_escape_string($_POST['lname']);
그런 다음 $ lname을 db에 삽입합니다.
DB에있을 때는 O 'Connor로 나타납니다.
따라서 웹 응용 프로그램에서 그 성을 기억한다면 다음을 사용해야합니다.
$lname = stripslashes($r["lname"]);
이 모든 것이 잘 작동하는 것 같습니다. 그러나 성을 검색하고 결과를 표시하는 검색 기능이 있습니다. 검색 할 때 결과를 얻으려면 O 'Connor를 검색해야합니다.
검색 후 TextBox는 방금 검색 한 내용 (세션 사용)의 값을 자동으로 저장합니다. 그래서 내 코드는 이것입니다.
$search = mysql_real_escape_string($_GET['search']);
$_SESSION['search'] = $search;
앞서 말했듯이 검색 할 때 "O 'Connor"를 사용해야하고 검색 후 텍스트 상자의 값이 "O 'Connor"가됩니다.
이것을 알아 내려고 노력하는 것은 실망 스러웠습니다. 내가 뭘 잘못하고 있는지 아는 사람 있나요? 감사!
편집하다:
마법 인용문과 관련하여 내 php5.ini 파일은 다음과 같습니다.
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
그러나 내 사이트는 Godaddy에서 호스팅되며 파일을 편집 할 권한이 없습니다.
해결책
처럼 들린다 마법 인용문 PHP 구성에서 활성화됩니다.
실제로 활성화되었는지 확인하려면 :
echo get_magic_quotes_gpc();
비활성화하려면, php.ini 파일 편집 :
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
; Use Sybase-style magic quotes (escape ' with '' instead of \').
magic_quotes_sybase = Off
또는이 줄을 .htaccess에 추가하십시오.
php_flag magic_quotes_gpc Off
다른 팁
마법 인용문이 활성화됩니다. 이것이 의미하는 바는 게시 또는 기타 유사한 위치에 배치 된 것이 자동으로 탈출되어 시작 프로그래머가 그것에 대해 걱정할 필요가 없다는 것입니다. 내가 올바르게 기억한다면 현재 PHP 버전에서는 더 이상 사용되지 않습니다.
이것을 다루기 위해하고 싶은 일을하고 스크립트가 구성에서 동일하게 실행되도록하십시오.
function fixinput($value){
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
return mysql_real_escape_string($value);
}
이를 수정하여 숫자가 아닌 데이터를 따옴표로 랩핑하기 위해이를 더 많이 수정할 수 있습니다. 이는 일반적인 변형이지만 수동으로 따옴표를 배치하는 것이 좋습니다.
PHP의 설치에 실제 탈출 문자열이 있는지 확인하기 위해 FixInput 함수로 편집 할 수 없습니다.
function fixinput($value){
if (get_magic_quotes_gpc()){
$value = stripslashes($value);
}
if (function_exists('mysql_real_escape_string')) {
return mysql_real_escape_string($value);
}
else {
return mysql_escape_string($value);
}
}
DB에있을 때는 O 'Connor로 나타납니다.
따라서 웹 응용 프로그램에서 그 성을 기억한다면 다음을 사용해야합니다.
$lname = stripslashes($r["lname"]);
잘못된! 당신이 끈을 피할 때 mysql_real_escape_string
, 그들은 쿼리에서만 탈출됩니다. 데이터베이스는 쿼리를 해석하므로 데이터는 탈출 문자없이 데이터베이스에서 끝납니다. 너 하지 마라 사용해야합니다 stripslashes
데이터베이스에서 데이터를 꺼낼 때 당신이 그렇게 생각한다면, 그것은 당신의 데이터베이스의 데이터가 엉망이된다는 것을 의미합니다. 마법 인용문이 켜져 있기 때문에 가능성이 높습니다.
당신은 :
- 마법 인용문을 끄거나 전 세계적으로 효과를 바꾸십시오. 보다 매뉴얼 자세한 내용은.
- 어느 쪽이든 바인딩 매개 변수 (최상의 솔루션) 또는 모든 변수를 탈출하십시오
mysql_real_escape_string
. 쿼리를 구축하는 곳 에서이 작업을 수행해야합니다. - 데이터베이스에서 꺼내는 일에 아무것도하지 마십시오.
특히 기능을 la로 만들지 마십시오. fixinput
그리고 여기에 일부 답변에 나열된 변형. 문제를 해결하는 것은 잘못된 방법입니다. HTTP- 요청에서 나오지 않는 데이터를 엉망으로 만들기 때문입니다.
나는 확인하지 않는다 get_magic_quotes_gpc
온/꺼짐입니다.
난 그냥 해요 $lname = mysql_real_escape_string(stripslashes($_POST['lname']));
따라서 인용 된 텍스트가 없으면 슬래시를 벗겨 내지 않습니다. 인용이 있으면 제거 할 것입니다.
그리고 그것은 나를 위해 놀라운 일을합니다!
검색 쿼리를 취하기 만하면 mysql_real_escape_string을 사용하면 완벽하게 괜찮아야합니다. 그러나이 작업을 수행하는 가장 좋은 방법은 탈출하지 않은 저장을하지 않고 모든 것이 데이터베이스로 들어가는 것입니다.
대신, 이것을 수행하십시오 :
$_SESSION['search'] = $_GET['search']; $search = mysql_real_escape_string($_GET['search']);