資訊安全:XSS


XSS (Cross-site Scripting)

簡單來說,XSS 即是在別人的網站,執行 JaxaScript 程式碼。在 HTML 裡使用<script>的標籤,可以讓網頁有更好的互動跟動態效果;但如果有人透過特定網站寫入任何 JavaScript 程式碼,就有機會讓有心人士竄改網頁、導入釣魚網站竊取使用者敏感資料的疑慮。

XSS 攻擊類型,共分成三個類型

1.儲存型 XSS

駭客透過網頁上的可輸入資料的欄位寫入惡意程式碼,讓瀏覽器連同惡意程式碼也一起執行;若是惡意程式碼經由使用者輸入之後,存入資料庫裡,後續網站使用者也會看到被惡意程式碼修改過的內容。這樣的攻擊常見於將用戶資料存放資料庫的網站,例如社群網站、或是有提供商品評論、用戶留言的服務的網站,都有機會遭受到儲存型 XSS 的攻擊。

2.反射型 XSS

駭客在網址列上,把惡意程式藏在 URL 裡面,透過 URL 能傳遞參數的機制,透過網址搜尋、狀態顯示、跳轉等功能的操作,誘導使用者點開網址,藉此達到反射型 XSS 的攻擊。反射型與儲存型 XSS 最大的不同是:反射型 XSS 的惡意代碼會出現在 URL 裡面,儲存型 XSS 的惡意代碼,會透過使用者的操作,將含有惡意的程式碼資料存入資料庫。

3.DOM 型 XSS

DOM 型 XSS 主要會發生在當瀏覽器接收到駭客寫入惡意程式碼,接收執行之後,再由前端的程式碼去執行被植入惡意程式碼的行為。DOM 型 XSS 由於是在瀏覽器端發生,與前端的程式碼維護相關。若是網頁前端中的程式碼內,有使用到 .html() 或是 .innerHTML() 等的語法,要特別小心駭客會插入不可信任的程式碼或是連結。 為了避免類似的攻擊 .innerText 的寫法會比較安全。

XSS 的防範:透過 PHP 跳脫字元的內建函式:htmlspecialchars()

透過跳脫字元函示,把內容轉譯成純文字,而不是程式碼。建議在資料輸出之前進行編碼;存進資料庫,還是以明文儲存,避免之後資料在跨平台使用時(例如:ios、android 等平台系統),原始資料不至於讓人無法解讀。

特別提醒自己,不要心存僥倖心態,escape 要做好做滿,把任何要輸出資料的地方(例如使用者暱稱),都編碼過後再輸出,確實建立好資安防線。

  • utils.php
<?php  
    function escape($str) {
        return htmlspecialchars($str, ENT_QUOTES);
    }
?>
  • index.php
<p class="card__content"><?php echo escape($row['content']); ?></p>

額外補充,另外一個需要注意 XSS 攻擊的地方

// 雖然已針對 $link 做過編碼,但若是能夠掌握 $link 輸出的話,就可以控制內容
<a href="<?php echo htmlspecialchars($link) ?>">my blog</a>
<a href="javascript:alert(1)">my blog</a>
  • 防範方法
// 禁止使用 JS 代碼、以及非法 scheme 等語法
allowSchemes = ["http", "https"];
valid = isValid( $link,  allowSchemes);

if (valid) {
  <a href="<?php echo htmlspecialchars($link) ?>">
    my blog
  </a>
} else {
  <a href="/404">
    my blog
  </a>
}







Related Posts

React 增進效能,避免重複渲染 Rerender

React 增進效能,避免重複渲染 Rerender

Vue.js 學習旅程Mile 13 – List Rendering 列表渲染篇:v-for

Vue.js 學習旅程Mile 13 – List Rendering 列表渲染篇:v-for

[VSCode] 在 Remote-SSH 時使用 power mode 效果

[VSCode] 在 Remote-SSH 時使用 power mode 效果






Comments