Heim  >  Artikel  >  Backend-Entwicklung  >  Häufige PHP-Sicherheitsangriffe und -Lösungen

Häufige PHP-Sicherheitsangriffe und -Lösungen

小云云
小云云Original
2018-03-13 11:42:472582Durchsuche

In diesem Artikel werden hauptsächlich häufige PHP-Sicherheitsangriffe und -Lösungen vorgestellt. Wenn Sie die häufigen Sicherheitsbedrohungen für PHP-Anwendungen verstehen, können Sie sicherstellen, dass Ihre PHP-Anwendung nicht angegriffen wird. Daher werden in diesem Artikel 6 häufige PHP-Sicherheitsangriffe aufgeführt. Jeder ist herzlich eingeladen, ihn zu lesen und zu lernen.

1. SQL-Injection

SQL-Injection ist ein böswilliger Angriff, bei dem Benutzer SQL-Anweisungen in Formularfelder eingeben, um die normale SQL-Ausführung zu beeinträchtigen. Es gibt auch eine Möglichkeit, die über den Befehl system() oder exec() injiziert wird und über denselben SQL-Injection-Mechanismus verfügt, aber nur auf Shell-Befehle abzielt.

01    $username = $_POST[&#39;username&#39;];02    $query = "select * from auth where username = &#39;".$username."&#39;";03    echo $query;04    $db = new mysqli(&#39;localhost&#39;, &#39;demo&#39;, ‘demo&#39;, ‘demodemo&#39;);05    $result = $db->query($query);06    if ($result && $result->num_rows) {07        echo "<br />Logged in successfully";08    } else {09        echo "<br />Login failed";10    }

Der obige Code filtert oder maskiert den vom Benutzer eingegebenen Wert ($_POST['username']) in der ersten Zeile nicht. Daher kann die Abfrage fehlschlagen oder sogar die Datenbank beschädigen, je nachdem, ob $username Ihre SQL-Anweisung in etwas anderes umwandelt.

SQL-Injection verhindern

Optionen:

使用mysql_real_escape_string()过滤数据
手动检查每一数据是否为正确的数据类型
使用预处理语句并绑定变量

Vorbereitete Anweisungen verwenden

分离数据和SQL逻辑
预处理语句将自动过滤(如:转义)
把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题
01    $query = 'select name, district from city where countrycode=?';02    if ($stmt = $db->prepare($query) )03    {04        $countrycode = 'hk';05        $stmt->bind_param("s", $countrycode); 
06        $stmt->execute();07        $stmt->bind_result($name, $district);08        while ( $stmt ($stmt->fetch() ){09            echo $name.', '.$district;10            echo 'ff9d32c555bb1d9133a29eb4371c1213';11        }12        $stmt->close();13    }

2. XSS-Angriff

XSS (Cross-Site Scripting) ist ein Angriff, bei dem der Benutzer einige Daten in Ihre Website eingibt, einschließlich clientseitigem Skript (normalerweise JavaScript). Wenn Sie Daten ohne Filterung auf eine andere Webseite ausgeben, wird dieses Skript ausgeführt.

Vom Benutzer übermittelte Textinhalte erhalten

01    <?php02    if (file_exists(&#39;comments&#39;)) {03        $comments = get_saved_contents_from_file(&#39;comments&#39;);04    } else {05        $comments = &#39;&#39;;06    }07     08    if (isset($_POST[&#39;comment&#39;])) {09        $comments .= &#39;<br />&#39; . $_POST[&#39;comment&#39;];10        save_contents_to_file(&#39;comments&#39;, $comments);11    }12    >
输出内容给(另一个)用户1    <form action=&#39;xss.php&#39; method=&#39;POST&#39;>2    Enter your comments here: <br />3    <textarea name=&#39;comment&#39;></textarea> <br />4    <input type=&#39;submit&#39; value=&#39;Post comment&#39; />5    </form><hr /><br />6     7    <?php echo $comments; ?>

Was wird passieren?

烦人的弹窗
刷新或重定向
损坏网页或表单
窃取cookie
AJAX(XMLHttpRequest)

XSS-Angriffe verhindern: Um XSS-Angriffe zu verhindern, verwenden Sie die PHP-Funktion htmlentities() zum Filtern und anschließenden Ausgeben an den Browser. Die grundlegende Verwendung von htmlentities() ist einfach, es stehen jedoch viele erweiterte Steuerelemente zur Verfügung, siehe XSS-Spickzettel.

3. Sitzungsfixierung

Sitzungssicherheit, vorausgesetzt, eine PHPSESSID ist schwer zu erraten. PHP kann jedoch eine Sitzungs-ID über ein Cookie oder eine URL akzeptieren. Daher kann das Spoofing eines Opfers mithilfe einer bestimmten (oder einer anderen) Sitzungs-ID oder eines Phishing-Angriffs erfolgen.

4. Sitzungserfassung und -hijacking

Dies ist die gleiche Idee wie die Sitzungsfixierung, beinhaltet jedoch den Diebstahl der Sitzungs-ID. Wenn die Sitzungs-ID in einem Cookie gespeichert ist, kann sie von einem Angreifer über XSS und JavaScript gestohlen werden. Wenn die Sitzungs-ID in der URL enthalten ist, kann diese auch durch Sniffing oder vom Proxyserver ermittelt werden.

Sitzungserfassung und -hijacking verhindern

更新ID
如果使用会话,请确保用户使用SSL

5. Cross-Site Request Forgery (CSRF)

Ein CSRF-Angriff bezieht sich auf eine Anfrage, die von einer Seite gestellt wird, die so aussieht Seien Sie ein vertrauensvoller Benutzer der Website, aber nicht absichtlich. Es gibt viele Variationen davon, wie dieses Beispiel:

1    ![](http://example.com/single_click_to_buy.php?user_id=123&item=12345)

Verhindern von Cross-Site-Request-Forgery

Stellen Sie im Allgemeinen sicher, dass der Benutzer aus Ihrem Formular stammt, und passen Sie jedes Formular an, das Sie senden Form aus. Es gibt zwei Punkte, die beachtet werden müssen:

对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。
生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。

6. Code-Injection

Code-Injection wird durch die Ausnutzung von Computerschwachstellen durch die Verarbeitung ungültiger Daten verursacht. Das Problem tritt auf, wenn Sie versehentlich beliebigen Code ausführen, normalerweise über die Dateieinbindung. Schlecht geschriebener Code kann dazu führen, dass eine Remote-Datei eingebunden und ausgeführt wird. Wie viele PHP-Funktionen kann require eine URL oder einen Dateinamen enthalten, zum Beispiel:

01    <form>Choose theme:02        <select name = theme>03            <option value = blue>Blue</option>04            <option value = green>Green</option>05            <option value = red>Red</option>06        </select>07        <input type = submit>08    </form>09    <?php10        if($theme) {11            require($theme.&#39;.txt&#39;);12        }13    ?>

Im obigen Beispiel wird durch Übergabe eines Dateinamens oder eines Teils eines vom Benutzer eingegebenen Dateinamens Es enthält die URL, die mit „http“ beginnt, Dateien, die mit „://“ beginnen.

Code-Injection verhindern

过滤用户输入
在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件。

Andere allgemeine Grundsätze

  1. Verlassen Sie sich nicht auf die Serverkonfiguration, um Ihre Anwendung zu schützen, insbesondere wenn Ihr Web Server/PHP wird von Ihrem ISP verwaltet oder kann in Zukunft an einen anderen Ort verschoben/bereitgestellt werden, wenn Ihre Website an einen anderen Ort verschoben/bereitgestellt wird. Bitte betten Sie sicherheitsrelevante Prüfungen/Logik in Ihren Website-Code ein (HTML, JavaScript, PHP usw.).

  2. Entwerfen Sie serverseitige Sicherheitsskripte:
    – verwenden Sie beispielsweise eine einzige Ausführungszeile – einen einzigen Punkt für Authentifizierung und Datenbereinigung
    – betten Sie beispielsweise ein PHP ein auf allen sicherheitsrelevanten Seiten Funktion/Datei, die alle Login-/Sicherheitslogikprüfungen übernimmt

  3. Stellen Sie sicher, dass Ihr Code auf dem neuesten Stand ist und gepatcht ist.

Verwandte Empfehlungen:

Detaillierte Erklärung von PHP-Sicherheitsbeispielen

Bilder sicher mit PHP hochladen

Detaillierte Zusammenfassung der PHP-Sicherheitskonfigurationsdatensätze und häufiger Fehler

Das obige ist der detaillierte Inhalt vonHäufige PHP-Sicherheitsangriffe und -Lösungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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