Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy konieczne jest użycie mysql_real_escape_string(), gdy magic_quotes_gpc jest włączone?

W przypadku niektórych rzadkich kodowań takich jak GBk - tak.
Ale nie powinieneś tego cofać z tego powodu. Magiczne cytaty i tak powinny być wyłączone (i będą w następnej wersji PHP). Tak więc mysql_real_escape_string() jest jedyną pozostałą funkcją ucieczki. Zauważ, że nie jest to funkcja zapobiegająca wstrzykiwaniu sql. Wiele osób nie rozumie tego punktu:to tylko część składni. Musi być używany nie do "ochrony" czegokolwiek, ale do złożenia poprawnego składniowo zapytania SQL. I musi być używany za każdym razem, gdy tworzysz zapytanie, bez względu na to, skąd pochodzą dane. Z pewnością ochroni Cię również przed wstrzyknięciami SQL, jako efekt uboczny.
Oczywiście mysql_real_escape_string() działa tylko w obrębie cytowanych ciągów. Tak więc, jeśli tak

$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

Nic nie będzie chroniło. Jeśli zamierzasz używać liczb niecytowanych, należy je rzutować na odpowiedni typ, obowiązkowo, na przykład:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Pamiętaj, że możesz utworzyć mysql_real_escape_string() działa zgodnie z przeznaczeniem, należy ustawić właściwe kodowanie klienta i jest to możliwe tylko z mysql_set_charset() funkcja, zapytanie SET NAMES tego nie ustawi.

Jeśli chcesz pozbyć się tych wszystkich zawiłości, możesz użyć przygotowane zestawienia , ale będziesz musiał zmienić sterownik mysql na mysqli lub PDO.

Należy pamiętać, że żadna właściwa składnia ani przygotowane instrukcje nie pomogą w przypadku części zapytania innych niż literały. Nie można uciec od identyfikatorów ani operatorów. Jeśli zdarzy ci się używać tych części dynamicznie, muszą one być zakodowane na stałe w twoim skrypcie, tak jak to (dla klauzuli ORDER BY):

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

lub to (klauzula WHERE)

$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. dziwne - mysql sql::SQLException nie jest przechwycony przez jego typ, ale przechwycony jako std::exception i pomyślnie odtworzony

  2. Użyj LIMIT do stronicowania wyników w zapytaniu MySQL

  3. Tożsamość .NET Core 2.1 pozyskuje wszystkich użytkowników wraz z przypisanymi im rolami

  4. Jak skonfigurować i zalogować się jako użytkownik root w MySQL?

  5. MySQL - znajdowanie słów otaczających wyszukiwane słowo kluczowe