Nå nej, der er ingen!
Teknisk set er der PDO::quote()
men det er sjældent nogensinde brugt og svarer ikke til >mysql_real_escape_string()
Det er rigtigt! Hvis du allerede bruger PDO på den rigtige måde som dokumenteret ved hjælp af forberedte erklæringer , så vil det beskytte dig mod MySQL-injektion.
# Example:
Nedenfor er et eksempel på et pengeskab databaseforespørgsel ved hjælp af forberedte sætninger (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();
}
Og nu, forudsat at forbindelsen er etableret, kan du udføre din forespørgsel på denne måde.
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);
}
Nu, som du sikkert kan se, har jeg ikke brugt noget til at undslippe/sanere værdien af $_POST["color"]
. Og denne kode er sikker fra myql-injection takket være PDO og kraften i forberedte udsagn.
Det er værd at bemærke, at du skal bestå en charset=utf8
som attribut i din DSN
som set ovenfor, af sikkerhedsmæssige årsager, og gør det altid muligt for PDO at vise fejl i form af undtagelser.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
så fejl fra dine databaseforespørgsler vil ikke afsløre følsomme data som din mappestruktur, databasebrugernavn osv.
Sidst, men ikke mindst, er der øjeblikke, hvor du ikke bør stole 100% på PDO, og vil være forpligtet til at tage nogle ekstra foranstaltninger for at forhindre sql-injektion, et af disse tilfælde er, hvis du bruger en forældet version af mysql [ mysql =< 5.3.6 ]
som beskrevet i dette svar
Men at bruge forberedte sætninger som vist ovenfor vil altid være sikrere end at bruge nogen af de funktioner, der starter med mysql_
God læsning