sql >> Databáze >  >> RDS >> Mysql

Jaký je ekvivalent PDO funkce mysql_real_escape_string?

No ne, žádný neexistuje!

Technicky existuje PDO::quote() ale používá se jen zřídka a není ekvivalentem mysql_real_escape_string()

Správně! Pokud již používáte PDO správným způsobem, jak je zdokumentováno pomocí připravených prohlášení , pak vás ochrání před injekcí MySQL.

# Example:

Níže je uveden příklad trezoru databázový dotaz pomocí připravených příkazů (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 nyní za předpokladu, že je navázáno připojení, můžete provést dotaz takto.

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

Nyní, jak pravděpodobně víte, nepoužil jsem nic k úniku/dezinfekci hodnoty $_POST["color"] . A tento kód je zabezpečen před myql-injection díky PDO a síle připravených výpisů.

Stojí za zmínku, že byste měli předat charset=utf8 jako atribut ve vašem DSN jak je vidět výše, z bezpečnostních důvodů a vždy povolte PDO zobrazovat chyby ve formě výjimek.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

takže chyby z vašich databázových dotazů neodhalí citlivá data, jako je vaše adresářová struktura, uživatelské jméno databáze atd.

V neposlední řadě jsou chvíle, kdy byste PDO neměli důvěřovat na 100% a budete muset přijmout nějaká další opatření, abyste zabránili vkládání sql, jedním z takových případů je, pokud používáte zastaralé verze mysql [ mysql =< 5.3.6 ] jak je popsáno v tato odpověď

Ale použití připravených příkazů, jak je uvedeno výše, bude vždy bezpečnější než použití kterékoli z funkcí, které začínají mysql_

Dobré čtení

Výukový program PDO pro vývojáře MySQL



  1. PHP se nemůže připojit k mysql přes python

  2. SQLSTATE[23000]:Porušení omezení integrity:1217

  3. Vygenerujte SQL pro aktualizaci primárního klíče

  4. jak poslat e-mail přes Pl/sql