Mysql
 sql >> база данни >  >> RDS >> Mysql

Какъв е PDO еквивалентът на функцията mysql_real_escape_string?

Е, не, няма такъв!

Технически има PDO::quote() но рядко се използва и не е еквивалент на mysql_real_escape_string()

Точно така! Ако вече използвате PDO по правилния начин, както е документирано с помощта на подготвени отчети , тогава ще ви предпази от MySQL инжектиране.

# Example:

По-долу е даден пример за сейф заявка за база данни с помощта на подготвени оператори (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();
 }

И сега, ако приемем, че връзката е установена, можете да изпълните заявката си по този начин.

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); 
 }

Сега, както вероятно можете да разберете, не съм използвал нищо за избягване/дезинфекция на стойността на $_POST["color"] . И този код е защитен от myql-инжекция благодарение на PDO и силата на подготвените оператори.

Струва си да се отбележи, че трябва да подадете charset=utf8 като атрибут във вашия DSN както се вижда по-горе, от съображения за сигурност и винаги позволявайте на PDO да показва грешки под формата на изключения.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

така че грешките от вашите заявки за база данни няма да разкрият чувствителни данни като структурата на вашата директория, потребителско име на базата данни и т.н.

Не на последно място, има моменти, в които не трябва да се доверявате на PDO 100% и ще трябва да предприемете някои допълнителни мерки за предотвратяване на sql инжектиране, един от тези случаи е, ако използвате остарели версии на mysql [ mysql =< 5.3.6 ] както описано в този отговор

Но използването на подготвени оператори, както е показано по-горе, винаги ще бъде по-безопасно, отколкото използването на която и да е от функциите, които започват с mysql_

Добро четиво

Ръководство за PDO за разработчици на 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. MySQL:Какво се случва с неагрегираните полета при GROUP BY?

  2. Сървърът не отговаря (или сокетът на локалния MySQL сървър не е конфигуриран правилно) в wamp сървър

  3. Едно поле на MySQL със стойности, разделени със запетая

  4. MAKETIME() Примери – MySQL

  5. JPA:как да запазя низ в поле на база данни, напишете MYSQL Text