Jaki jest odpowiednik PDO funkcji mysql real escape string?

Modyfikuję mój kod z mysql_* Na PDO. W kodzie miałem mysql_real_escape_string(). Jaki jest odpowiednik tego w PDO?

Author: Peter Mortensen, 2012-12-23

5 answers

Nie, Nie ma żadnego!

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

Zgadza się! Jeśli używasz PDO w odpowiedni sposób, jak udokumentowano za pomocą prepared statements , to ochroni Cię przed wstrzyknięciem MySQL.


# Example:

Poniżej znajduje się przykład bezpiecznego zapytania bazy danych z użyciem gotowych instrukcji (pdo)

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xx;charset=utf8", "xx", "xx", [
       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 jest ustanowione, możesz wykonać swoje 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 widać, nie użyłem niczego, aby uciec/odkażać wartość $_POST["color"]. A ten kod jest zabezpieczony przed myql-injection dzięki PDO i mocy przygotowanych oświadczeń.


Warto zauważyć, że należy przekazać charset=utf8 jako atrybut, w swoim DSN Jak widać powyżej, ze względów bezpieczeństwa i zawsze włączyć PDO, aby pokazać błędy w forma WYJĄTKÓW.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

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

Wreszcie, są chwile, kiedy nie należy ufać PDO 100% , i będzie zobowiązany do podjęcia dodatkowych środków, aby zapobiec SQL injection, jednym z tych przypadków jest, jeśli używasz przestarzałej wersji mysql [ mysql =< 5.3.6 ] jak opisane w tej odpowiedzi

Ale, używając gotowych oświadczeń, jak pokazano powyżej zawsze będzie bezpieczniejsze, niż użycie którejkolwiek z funkcji zaczynających się od mysql_

Dobra lektura

PDO Tutorial for MySQL Developers

 59
Author: samayo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 16:11:44

Nie ma*! Celem PDO jest to, że nie musisz przed niczym uciekać; po prostu wysyłasz je jako dane. Na przykład:

$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!

W przeciwieństwie do:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");

* Cóż, jest jeden, jak powiedział Michael Berkowski! Ale są lepsze sposoby.

 25
Author: Ry-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 15:50:57
$v = '"'.mysql_real_escape_string($v).'"'; 

Jest odpowiednikiem $v = $this->db->quote($v); upewnij się, że masz instancję PDO w $this->db, więc możesz wywołać metodę PDO quote()

 3
Author: simohamed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-04 13:58:24

Nie ma potrzeby stosowania mysql_real_escape_string w PDO.

PDO sam dostosowuje znak specjalny w zapytaniu mysql ,wystarczy przekazać anonimowy parametr i powiązać go z czasem działania.w ten sposób Załóżmy, że masz tabelę użytkownika z nazwą atrybutu, adresem e-mail i hasłem i musisz wstawić do tego użycia instrukcję prepare w następujący sposób możesz podać nazwę jako = > $name= "Rajes ' h";

Powinno się wykonać nie ma potrzeby odpowiednika mysql_real_escape_string

$stmt="INSERT into user(name,email,password) VALUES(:name,:email,password)";
try{
   $pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
   $pstmt->bindParam(':name',$name,PDO::PARAM_STR);
   $pstmt->bindParam(':email',$email,PDO::PARAM_STR);
   $pstmt->bindParam(':password',$password,PDO::PARAM_STR);
   $status=$pstmt->execute();
   if($status){
    //next line of code 
   }


}catch(PDOException $pdo){
     echo $pdo->getMessage();
}
 0
Author: IMRA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 13:08:03

Jeśli odpowiedzieć na pierwotne pytanie, to jest to odpowiednik PDO dla mysql_real_escape_string:

function my_real_escape_string($value, $connection) {
    /* 
    // this fails on: value="hello'";
    return trim ($connection->quote($value), "'");
    */
    return substr($connection->quote($value), 1, -1);       
}

Btw, odpowiednik mysqli to:

function my_real_escape_string($value, $connection) {
    return mysqli_real_escape_string($connection, $value);
}
 -1
Author: IT goldman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 08:02:25