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

Jaki jest odpowiednik funkcji mysql_real_escape_string w PDO?

Cóż, nie ma żadnego!

Technicznie istnieje PDO::quote() ale jest rzadko używany i nie jest odpowiednikiem mysql_real_escape_string()

Zgadza się! Jeśli już używasz PDO we właściwy sposób, zgodnie z dokumentacją przy użyciu przygotowanych wyciągów , to ochroni Cię przed wstrzyknięciem MySQL.

# Example:

Poniżej znajduje się przykład bezpiecznego zapytanie do bazy danych za pomocą przygotowanych instrukcji (pdo)

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
       PDO::ATTR_EMULATE_PREPARES => false, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
     ]); 
 } catch(\PDOException $e){
     // if connection fails, show PDO error. 
   echo "Error connecting to mysql: " . $e->getMessage();
 }

A teraz zakładając, że połączenie zostało nawiązane, możesz wykonać zapytanie w ten sposób.

if($_POST && isset($_POST['color'])){ 

    // preparing a statement
    $stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");

    // execute/run the statement. 
    $stmt->execute(array($_POST['color']));

    // fetch the result. 
    $cars = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($cars); 
 }

Teraz, jak prawdopodobnie wiesz, nie użyłem niczego do ucieczki/oczyszczenia wartości $_POST["color"] . A ten kod jest zabezpieczony przed myql-injection dzięki PDO i mocy przygotowanych wyciągów.

Warto zauważyć, że powinieneś przekazać charset=utf8 jako atrybut, w Twoim DSN jak widać powyżej, ze względów bezpieczeństwa i zawsze włączaj PDO, aby wyświetlać błędy w formie wyjątków.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

więc błędy z zapytań do bazy danych nie ujawnią poufnych danych, takich jak struktura katalogów, nazwa użytkownika bazy danych itp.

Wreszcie, są chwile, kiedy nie powinieneś ufać PDO w 100% i będziesz musiał podjąć dodatkowe środki, aby zapobiec wstrzykiwaniu sql, jednym z tych przypadków jest, jeśli używasz przestarzałej wersji mysql [ mysql =< 5.3.6 ] jak opisany w ta odpowiedź

Jednak użycie przygotowanych instrukcji, jak pokazano powyżej, będzie zawsze bezpieczniejsze niż użycie dowolnej funkcji, która zaczyna się od mysql_

Dobre lektury

Samouczek PDO dla programistów MySQL



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sequelize zapytanie geoprzestrzenne:znajdź n punktów najbliższych lokalizacji

  2. PHP/MySQL:Najlepsze praktyki w zakresie operacji/przechowywania pieniędzy?

  3. Ponowne uruchamianie transakcji w MySQL po zakleszczeniu

  4. Bardzo proste wprowadzanie danych przez użytkownika w django

  5. Dane MySQL INSERT nie są zapisywane w odpowiedniej bazie danych, tylko tymczasowo?