如何解決網站弱點掃描的 Cross-Site Scripting 問題?(PHP)

介紹

跨網站指令碼(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是代碼注入的一種。它允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了 HTML 以及使用者端手稿語言。

XSS 攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使使用者載入並執行攻擊者惡意製造的網頁程式。這些惡意網頁程式通常是 JavaScript,但實際上也可以包括 Java,VBScript,ActiveX,Flash 或者甚至是普通的 HTML。攻擊成功後,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、對談和 cookie 等各種內容。

PHP 如何解決 Cross-Site Scripting 問題

範例:

<?php
    $get_par = $_GET['TDATA'];
?>
<form id="frmQuery" method="post"  role="form">
    <input name="TDATA" type="text" value="<?=$get_par;?>" >
    <input type="submit" value="Submit">
</form>

上述範例中,我們假設情境是:現在有個搜尋用的表單,我們可以讓使用者在 URL 帶參數 TDATA,其值會自動帶入表單中當作搜尋參數的預設值。在頁面中會使用 GET 方法來抓取 TDATA,並將其預設值帶入搜尋表單中。其效果會如下圖, 這邊 TDATA 帶入 21,其值就自動帶入 input 欄位:

接下來我們修改參數,讓其帶入

"><script>alert(1)</script>

效果會如下圖,可以發現一進入網頁會觸發 js 的 alert 函式。

alert 可以被任意執行代表攻擊者(Attcker)可以用 js 注入你的網頁做任何可怕的事,畢竟網頁就是由 HTML + JS 組成,而 JS 可以做的事非常多,甚至可以取得到 cookie﹍等機密資料。

為了防止 Cross-Site Scripting 發生,我們在接收到 TDATA 時要另外再做些處理,這裡我們使用 PHP 的函式 htmlspecialchars,將一些特殊字元先轉成 HTML 實體編碼。

<?php
    $get_par = htmlspecialchars($_GET['TDATA'], ENT_QUOTES, 'UTF-8');
?>
<form id="frmQuery" method="post"  role="form">
    <input name="TDATA" type="text" value="<?=$get_par;?>" >
    <input type="submit" value="Submit">
</form>

呈現效果如下,可以看到不會執行 js 的程式了。

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。