Heim Backend-Entwicklung PHP-Tutorial Um SQL-Injection in PHP zu verhindern, verwenden Sie keine Addslashes und mysql_real_escape_string mehr.

Um SQL-Injection in PHP zu verhindern, verwenden Sie keine Addslashes und mysql_real_escape_string mehr.

Aug 08, 2016 am 09:30 AM
name pdo stmt string

Der Blogger ist an verschiedenen Internet-Technologien interessiert. Er ist oft wortreich und wird oft von Zwangsstörungen begleitet. Wenn Sie denken, dass der Artikel für Sie hilfreich ist, können Sie mir folgen. Bitte markieren Sie beim Nachdruck „Dark Blue Scythe“


Ich habe viele PHP-Websites gesehen, die immer noch Addslashes und str_replace verwenden, um SQL-Injection zu verhindern, schauen Sie sich das an Baidu verwendet sie auch. In der Praxis hat sich herausgestellt, dass sogar mysql_real_escape_string Möglichkeiten bietet, diese zu umgehen. Drei Methoden , dann wird mein Blogbeitrag sinnvoll sein, um alle Nachzügler daran zu erinnern, diese Grube zu umgehen.

Aus Rücksicht darauf, Bäume für zukünftige Generationen zu pflanzen, anstatt Löcher zu graben, stellen wir PHP- und MYSQL-Versionen zur Verfügung Informationen, damit das „Problem“ in Zukunft kein „Problem“ mehr ist.

Verwenden Sie str_replace und verschiedene Funktionen zum Ersetzen von PHP-Zeichen, um diese Art von „Schwarzem“ zu verhindern Die „Listen“-Verteidigung hat sich als nicht haltbar erwiesen.

Das Folgende ist eine Methode zum Umgehen von addslasher und mysql_real_escape_string ( Trick).


Hinweis: Obwohl der Trick unter MYSQL5.5.37-log behoben wurde, handelt es sich immer noch um die Injektion Da das Problem noch nicht vollständig gelöst ist, schlage ich vor, sofort Verbesserungen vorzunehmen. Deshalb spreche ich auch über mehrere Methoden, mit denen Programmierer ihre Fähigkeiten schnell verbessern können. Ein sehr wichtiger Punkt, der in „.

Hinweis: Wenn Sie nicht sicher sind, ob bei Ihrem System das Risiko einer SQL-Injection besteht, stellen Sie bitte die folgende DEMO auf Ihrem Server bereit. Wenn die laufenden Ergebnisse gleich sind, lesen Sie bitte die endgültige perfekte Lösung.

MYSQL:

mysql> select version();
+---------------------+
| version()           |
+---------------------+
| 5.0.45-community-ny |
+---------------------+
1 row in set (0.00 sec)
mysql> create database test default charset GBK;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE users (
    username VARCHAR(32) CHARACTER SET GBK,
    password VARCHAR(32) CHARACTER SET GBK,
    PRIMARY KEY (username)
);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users SET username='ewrfg', password='wer44';
Query OK, 1 row affected (0.01 sec)
mysql> insert into users SET username='ewrfg2', password='wer443';
Query OK, 1 row affected (0.01 sec)
mysql> insert into users SET username='ewrfg4', password='wer4434';
Query OK, 1 row affected (0.01 sec)=
Nach dem Login kopieren

PHP:

<?php
echo "PHP version: ".PHP_VERSION."\n";

mysql_connect(&#39;servername&#39;,&#39;username&#39;,&#39;password&#39;);
mysql_select_db("test");
mysql_query("SET NAMES GBK");

$_POST[&#39;username&#39;] = chr(0xbf).chr(0x27).&#39; OR username = username /*&#39;;
$_POST[&#39;password&#39;] = &#39;guess&#39;;

$username = addslashes($_POST[&#39;username&#39;]);
$password = addslashes($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());

$username = mysql_real_escape_string($_POST[&#39;username&#39;]);
$password = mysql_real_escape_string($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());

mysql_set_charset("GBK");
$username = mysql_real_escape_string($_POST[&#39;username&#39;]);
$password = mysql_real_escape_string($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());
Nach dem Login kopieren

Das Ergebnis:
PHP version: 5.2.5
int(3)
string(6) "latin1"
int(3)
string(6) "latin1"
int(0)
string(3) "gbk" 
Nach dem Login kopieren
Das können Sie siehe es Ob Addslashes oder mysql_real_escape_string verwenden, Ich kann Programmierschwachstellen nutzen, um einen Injektionsangriff zu erreichen, der es mir ermöglicht, mich durch Eingabe eines beliebigen Passworts beim Server anzumelden! ! ! ! (Ich werde nicht näher auf das Prinzip des Angriffs eingehen. Interessierte Schüler können sich mit den Single-Byte- und Multi-Byte-Problemen bei der Zeichenkodierung befassen.)

Hinweis: Der dritte mysql_real_escape_string kann die Injektion verhindern, weil mysql_escape_string selbst die aktuelle Codierung nicht bestimmen kann. Durch Hinzufügen können Sie die Codierung des Servers verhindern Probleme. Obwohl SQL-Injection bis zu einem gewissen Grad verhindert werden kann, wird die folgende perfekte Lösung dennoch empfohlen.

Die perfekte Lösung besteht darin, PDO und MYSQLi mit dem Prepared Statement-Mechanismus zu verwenden, um mysql_query zu ersetzen (Hinweis: mysql_query ist seit PHP 5.5.0 veraltet und wird in Zukunft verschoben Außer):

PDO:

$pdo = new PDO(&#39;mysql:dbname=dbtest;host=127.0.0.1;charset=utf8&#39;, &#39;user&#39;, &#39;pass&#39;);

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}
Nach dem Login kopieren

MYSQLi:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}
Nach dem Login kopieren

Das Obige stellt vor, wie man SQL-Injection in PHP verhindert. Ich hoffe, dass es für Freunde, die sich für PHP-Tutorials interessieren, hilfreich sein wird.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Lösung für PHP Schwerwiegender Fehler: Aufruf der undefinierten Methode PDO::prepare() in Lösung für PHP Schwerwiegender Fehler: Aufruf der undefinierten Methode PDO::prepare() in Jun 22, 2023 pm 06:40 PM

PHP ist eine beliebte Webentwicklungssprache, die schon seit langem verwendet wird. Die in PHP integrierte PDO-Klasse (PHP Data Object) ist für uns eine gängige Möglichkeit, bei der Entwicklung von Webanwendungen mit der Datenbank zu interagieren. Ein Problem, auf das einige PHP-Entwickler jedoch häufig stoßen, besteht darin, dass sie bei Verwendung der PDO-Klasse zur Interaktion mit der Datenbank eine Fehlermeldung wie diese erhalten: PHPFatalerror:CalltoundefinedmethodPDO::prep

Konvertieren Sie grundlegende Datentypen mit der Java-Funktion String.valueOf() in Strings Konvertieren Sie grundlegende Datentypen mit der Java-Funktion String.valueOf() in Strings Jul 24, 2023 pm 07:55 PM

Konvertieren Sie grundlegende Datentypen mit der Java-Funktion String.valueOf() in Strings. Wenn wir in der Java-Entwicklung grundlegende Datentypen in Strings konvertieren müssen, ist eine gängige Methode die Verwendung der Funktion valueOf() der String-Klasse. Diese Funktion kann Parameter grundlegender Datentypen akzeptieren und die entsprechende Zeichenfolgendarstellung zurückgeben. In diesem Artikel untersuchen wir, wie die Funktion String.valueOf() für grundlegende Datentypkonvertierungen verwendet wird, und stellen einige Codebeispiele dafür bereit

PHP und PDO: So führen Sie Masseneinfügungen und -aktualisierungen durch PHP und PDO: So führen Sie Masseneinfügungen und -aktualisierungen durch Jul 28, 2023 pm 07:41 PM

PHP und PDO: So führen Sie Stapeleinfügungen und -aktualisierungen durch. Einführung: Wenn Sie PHP zum Schreiben datenbankbezogener Anwendungen verwenden, stoßen Sie häufig auf Situationen, in denen Sie Daten stapelweise einfügen und aktualisieren müssen. Der traditionelle Ansatz besteht darin, Schleifen zur Ausführung mehrerer Datenbankoperationen zu verwenden, diese Methode ist jedoch ineffizient. Das PDO (PHPDataObject) von PHP bietet eine effizientere Möglichkeit, Batch-Einfüge- und Aktualisierungsvorgänge durchzuführen. In diesem Artikel wird erläutert, wie Sie PDO zum Implementieren von Batch-Einfüge- und Aktualisierungsvorgängen verwenden. 1. Einführung in PDO: PDO ist PH

So konvertieren Sie ein Char-Array in einen String So konvertieren Sie ein Char-Array in einen String Jun 09, 2023 am 10:04 AM

Methode zum Konvertieren eines char-Arrays in einen String: Dies kann durch Zuweisung erreicht werden. Verwenden Sie die Syntax {char a[]=" abc d\0efg ";string s=a;}, damit das char-Array dem String direkt einen Wert zuweisen und ausführen kann Der Code zum Abschließen der Konvertierung.

Verwenden Sie die String.replace()-Funktion von Java, um Zeichen (Strings) in einem String zu ersetzen Verwenden Sie die String.replace()-Funktion von Java, um Zeichen (Strings) in einem String zu ersetzen Jul 25, 2023 pm 05:16 PM

Ersetzen Sie Zeichen (Strings) in einem String mit der Java-Funktion String.replace(). In Java sind Strings unveränderliche Objekte, was bedeutet, dass der Wert eines String-Objekts nach der Erstellung nicht mehr geändert werden kann. Es kann jedoch vorkommen, dass Sie bestimmte Zeichen oder Zeichenfolgen in einer Zeichenfolge ersetzen müssen. Zu diesem Zeitpunkt können wir die Methode replace () in der String-Klasse von Java verwenden, um das Ersetzen von Zeichenfolgen zu implementieren. Die Methode replace() der Klasse String hat zwei Typen:

PHP PDO vs. MySQL: Vergleich und Kontrast PHP PDO vs. MySQL: Vergleich und Kontrast Feb 19, 2024 pm 12:24 PM

PDOPDO ist eine objektorientierte Abstraktionsschicht für den Datenbankzugriff, die eine einheitliche Schnittstelle für PHP bereitstellt und es Ihnen ermöglicht, denselben Code für die Interaktion mit verschiedenen Datenbanken (z. B. Mysql, Postgresql, Oracle) zu verwenden. PDO verbirgt die Komplexität der zugrunde liegenden Datenbankverbindungen und vereinfacht Datenbankoperationen. Vorteile und Nachteile Vorteile: Einheitliche Schnittstelle, unterstützt mehrere Datenbanken, vereinfacht Datenbankoperationen, reduziert Entwicklungsschwierigkeiten, stellt vorbereitete Anweisungen bereit, verbessert die Sicherheit, unterstützt die Transaktionsverarbeitung. Nachteile: Die Leistung ist möglicherweise etwas geringer als bei nativen Erweiterungen, ist auf externe Bibliotheken angewiesen, kann den Overhead erhöhen. Democode verwendet PDO Connect zur MySQL-Datenbank: $db=newPDO("mysql:host=localhost;dbnam

Die Bedeutung und praktische Methoden von $stmt php in der Programmierung Die Bedeutung und praktische Methoden von $stmt php in der Programmierung Feb 27, 2024 pm 02:00 PM

Die Bedeutung und die praktischen Methoden von $stmtPHP in der Programmierung Im Prozess der PHP-Programmierung ist die Verwendung des $stmt-Objekts zum Ausführen vorbereiteter Anweisungen (PreparedStatement) eine sehr wertvolle Technologie. Diese Technologie kann nicht nur die Sicherheit des Programms verbessern, sondern auch SQL-Injection-Angriffe wirksam verhindern und den Datenbankbetrieb effizienter machen. Die Bedeutung von $stmtPHP bei der Programmierung vorbereiteter Anweisungen bezieht sich auf die Aufteilung der SQL-Anweisung in zwei Teile vor der Ausführung: SQ

PHP und PDO: So führen Sie Paging-Abfragen durch und zeigen Daten an PHP und PDO: So führen Sie Paging-Abfragen durch und zeigen Daten an Jul 29, 2023 pm 04:10 PM

PHP und PDO: Abfragen und Anzeigen von Daten auf Seiten Bei der Entwicklung von Webanwendungen ist das Abfragen und Anzeigen von Daten auf Seiten eine sehr häufige Anforderung. Durch Paging können wir eine bestimmte Datenmenge gleichzeitig anzeigen und so die Seitenladegeschwindigkeit und das Benutzererlebnis verbessern. In PHP können die Funktionen der Paging-Abfrage und der Anzeige von Daten einfach mithilfe der PHP Data Object (PDO)-Bibliothek realisiert werden. In diesem Artikel wird erläutert, wie Sie PDO in PHP verwenden, um Daten seitenweise abzufragen und anzuzeigen, und entsprechende Codebeispiele bereitstellen. 1. Erstellen Sie Datenbank- und Datentabellen

See all articles