Sind mysql_real_escape_string() und mysql_escape_string() für die App-Sicherheit ausreichend?
Während diese Funktionen einen gewissen Schutz vor SQL-Injection und anderen Angriffen bieten können , sie beheben bestimmte Schwachstellen nicht.
SQL Injection
Mysql_real_escape_string() kann Ihre Anwendung immer noch einer SQL-Injection aussetzen, wenn Sie PHP-Variablen in Abfragen nicht ordnungsgemäß verarbeiten. Betrachten Sie das folgende Beispiel:
$sql = "SELECT number FROM PhoneNumbers WHERE " . mysql_real_escape_string($field) . " = " . mysql_real_escape_string($value);
Diese Abfrage kann von einem Angreifer manipuliert werden, um nicht autorisierte SQL-Anweisungen auszuführen, da mysql_real_escape_string() nicht dafür ausgelegt ist, Tabellennamen, Spaltennamen oder LIMIT-Felder zu sichern.
Ähnliche Angriffe
Mysql_real_escape_string() reicht nicht aus, um LIKE-Exploits zu verhindern. Ein Angreifer könnte einen böswilligen Wert wie „%%“ eingeben, um alle Datensätze zurückzugeben, wodurch möglicherweise vertrauliche Informationen gefährdet werden.
Charset-Exploits
Bestimmte Browser sind möglicherweise für Zeichensätze anfällig Exploits, die es Angreifern ermöglichen, bösartige Zeichen einzuschleusen, die Escape-Mechanismen umgehen und beliebiges SQL ausführen Befehle.
Vorbereitete Anweisungen: Eine umfassende Lösung
Um Ihre Anwendung effektiv zu schützen, wird empfohlen, vorbereitete Anweisungen anstelle von mysql_real_escape_string() zu verwenden. Vorbereitete Anweisungen führen SQL-Abfragen mit vom Benutzer bereitgestellten Werten aus, indem sie diese als Parameter binden. Dadurch ist kein manuelles Escape erforderlich und es wird sichergestellt, dass nur autorisiertes SQL ausgeführt wird.
Hier ist ein Beispiel für die Verwendung einer vorbereiteten Anweisung in PHP:
$pdo = new PDO($dsn); $column = 'url'; $value = 'http://www.example.com/'; $limit = 1; // Validate the search parameter column. $validColumns = array('url', 'last_fetched'); if (!in_array($column, $validColumns)) { $column = 'id'; } $statement = $pdo->prepare('SELECT url FROM GrabbedURLs ' . 'WHERE ' . $column . '=? ' . 'LIMIT ' . intval($limit)); $statement->execute(array($value)); while (($data = $statement->fetch())) { }
Vorbereitete Anweisungen bieten einen proaktiven Abwehrmechanismus, indem sie die Sicherheitsfunktionen des zugrunde liegenden Datenbankservers nutzen. Sie sind von Natur aus resistent gegen bekannte und unbekannte Angriffe und gewährleisten so die Integrität Ihrer Daten.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3