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

PHP MySQLI zapobiega wstrzykiwaniu SQL

Każde zapytanie może zostać wstrzyknięte, niezależnie od tego, czy jest odczytywane, czy zapisywane, trwałe lub przejściowe. Wstrzyknięcia można wykonać poprzez zakończenie jednego zapytania i uruchomienie oddzielnego (możliwe przy użyciu mysqli ), co sprawia, że ​​zamierzone zapytanie staje się nietrafne.

Wszelkie dane wejściowe do zapytania ze źródła zewnętrznego, niezależnie od tego, czy pochodzą od użytkowników, czy nawet wewnętrzne, powinny być traktowane jako argument zapytania i parametr w kontekście zapytania. Każdy parametr w zapytaniu musi być sparametryzowany. Prowadzi to do odpowiednio sparametryzowanego zapytania, z którego można utworzyć przygotowaną instrukcję i wykonać ją za pomocą argumentów. Na przykład:

SELECT col1 FROM t1 WHERE col2 = ?

? jest symbolem zastępczym parametru. Korzystanie z mysqli , możesz utworzyć przygotowane zestawienie za pomocą prepare , powiąż zmienną (argument) z parametrem za pomocą bind_param i uruchom zapytanie za pomocą execute . Nie musisz w ogóle oczyszczać kłótni (w rzeczywistości jest to szkodliwe). mysqli robi to dla ciebie. Cały proces byłby następujący:

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

Istnieje również ważna różnica między sparametryzowanym zapytaniem i przygotowane oświadczenie . Ta instrukcja, po przygotowaniu, nie jest sparametryzowana i dlatego jest podatna na wstrzyknięcie:

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

Podsumowując:

  • Wszystkie Zapytania powinny być odpowiednio sparametryzowane (chyba że nie mają parametrów)
  • Wszystkie argumenty zapytania powinny być traktowane jako wrogie, bez względu na ich źródło



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie SELECT INTO OUTFILE w MySQL

  2. MySQL:Jak zresetować lub zmienić hasło roota MySQL?

  3. Jak zaimportować bazę danych za pomocą wiersza poleceń

  4. W zapytaniach MySQL, po co używać join zamiast gdzie?

  5. Jak zaimportować bazę danych za pomocą phpMyAdmin