Heim > Datenbank > MySQL-Tutorial > Wie schützen Sie Ihre Website vor SQL-Injection-Angriffen?

Wie schützen Sie Ihre Website vor SQL-Injection-Angriffen?

黄舟
Freigeben: 2017-05-20 17:21:03
Original
1467 Leute haben es durchsucht

Wie schützen Sie Ihre Website vor SQL-Injection-Angriffen?

SQL-Injection-Angriff bedeutet, dass der Angreifer den Eingabemechanismus legitimer Benutzer auf der Website verwendet, um SQL-Code zur Ausführung an die Datenbank zu senden. Die goldene Regel zur Vermeidung von SQL-Injection-Angriffen lautet: alle Daten aus externen Quellen entkommen, bevor sie die Datenbank erreichen. Diese Regel gilt nicht nur für INSERT- und UPDATE-Anweisungen, sondern auch für SELECT-Abfragen~

Die Verwendung vorkompilierter Anweisungen in Skriptabfragen kann fast alle Probleme mit SQL-Injection-Angriffen beseitigen, wenn Sie sich jedoch für die Verwendung der query()-Methode entscheiden, Es gibt keinen solchen Schutz – Benutzereingaben, die der Abfrage hinzugefügt werden, müssen manuell maskiert werden. Der Code lautet wie folgt:

<?php
    $dbms = "mysql";                                  // 数据库的类型
    $dbName ="php_cn";                                //使用的数据库名称
    $user = "root";                                   //使用的数据库用户名
    $pwd = "root";                                    //使用的数据库密码
    $host = "localhost";                              //使用的主机名称
    $dsn  = "$dbms:host=$host;dbname=$dbName";
    $name =&#39;mr&#39;;
    $name ="&#39;or Name LIKE&#39;%";
    $query="select * from user where username = &#39;".$name."&#39;";//sql语句
try {
    $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $result = $pdo->query($query);    //输出结果集中的数据
    foreach ($result as $row){        //输出结果集中的数据
        ?>
<tr>
    <td bgcolor="#FFFFFF"><div align="center"><?php echo $row[&#39;username&#39;];?></div></td>
</tr>
<?php
    }
}catch (Exception $e){
    echo "ERROR!!".$e->getMessage()."<br>";
}
?>
Nach dem Login kopieren

In diesem Beispiel wird davon ausgegangen, dass die Variable $name in der SQL-Anweisung aus dem vom Benutzer übermittelten Formular stammt. Normalerweise sendet der Benutzer so etwas wie „mr“, wodurch die folgende SQL-Anweisung generiert wird:

select * from user where username = &#39;mr&#39;
Nach dem Login kopieren
Nach dem Login kopieren

Dies verursacht keine Probleme im Skript, ein „intelligenter“ Angreifer kann jedoch eintreten „‘OR Name LIKE‘%“, was zu folgender SQL-Anweisung führt:

select * from user where username = &#39;mr&#39;
Nach dem Login kopieren
Nach dem Login kopieren

Dies verursacht keine Probleme im Skript, ein „cleverer“ Angreifer kann jedoch „‘OR Name LIKE‘“ eingeben %“, was zur folgenden SQL-Anweisung führt:

select * from user where username ="OR Name LIKE&#39;%&#39;
Nach dem Login kopieren

Diese Eingabe öffnet die gesamte Tabelle für den Angreifer, und wenn es sich um sehr sensible Daten handelt, werden sie vollständig offengelegt. Mit welcher Methode lässt sich dieses Problem lösen?

Lösung

Um dieses Problem zu lösen, können Sie die Quote-Methode in PDO verwenden, um die an die SQL-Zeichenfolge übergebenen Daten zu maskieren, einfach The Der SQL-Code muss wie folgt geändert werden:

$sql="select * from user where username = &#39;".$pdo->quote($name)."&#39;";
Nach dem Login kopieren

Bedenken Sie, dass jedes in der SQL-Abfrage verwendete Datenelement in Anführungszeichen gesetzt werden muss. Es gibt hierfür keine Abkürzung, es sei denn, Sie erwägen die Verwendung von Prepare() und Execute(. ) Methoden.

Hinweis:

Wenn Sie die Methode PDO->query() verwenden, müssen Sie dies immer tun Die Verwendung der quote()-Methode bezieht sich auf die Eingabe des Benutzers. Denken Sie daran, dass dies „immer erforderlich“ ist.

Wenn Sie sich für die Verwendung der Methoden „prepare()“ und „execute()“ entscheiden, müssen Sie nicht auf die Werte verweisen, die an gebunden werden müssen In diesem Fall ist es jedoch möglicherweise nicht möglich, eine Variable an eine vorkompilierte SQL-Anweisung zu binden Beim Erstellen einer dynamischen SQL-Anweisung müssen Sie alle Werte in Anführungszeichen setzen, die nicht gebunden werden können (z. B. GROUP BY-Klausel oder ORDER BY oder Tabellenname).

Das sind also alle Lösungen zum Schutz von Websites vor SQL-Injection-Angriffen. Ich glaube, dass jeder die Wissenspunkte in diesem Abschnitt leicht beherrschen kann~

Das obige ist der detaillierte Inhalt vonWie schützen Sie Ihre Website vor SQL-Injection-Angriffen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage