1. 程式人生 > >php XSS攻擊原理與防禦

php XSS攻擊原理與防禦

資料安全是軟體設計中要考慮的問題,在程式中保持資料的安全,除了保證程式碼內部執行的可靠,最主要就是嚴格控制外部資料,秉持一切使用者輸入的都是不可靠的原則,做好資料的驗證和過濾.

PHP最簡單的過濾機制就是轉義,對使用者的輸入和輸出進行轉義和過濾.

我們先搞一個例子:
下面是一個很簡單的表單

    <form action="" method="post">
        留言:<textarea name="content" rows="20" cols="40"></textarea>
        <input type="submit" value
="提交">
</form> <?php echo $_POST['content']; ?>

在文字區域內輸入

<style>body{background:#000}</style>

點選提交,會發現瀏覽器除了輸入框外都變成黑色的.檢視頁面原始碼,會發現是因為原樣地輸出了css程式碼.這其實就是XSS攻擊

XSS攻擊百度百科:

XSS攻擊全稱跨站指令碼攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為XSS,XSS是一種在web應用中的電腦保安漏洞,它允許惡意web使用者將程式碼植入到提供給其它使用者使用的頁面中

XSS攻擊當然不是我們這裡所寫的新增CSS樣式程式碼這麼低端.它可以做到很多危害

1、盜取各類使用者帳號,如機器登入帳號、使用者網銀帳號、各類管理員帳號
2、控制企業資料,包括讀取、篡改、新增、刪除企業敏感資料的能力
3、盜竊企業重要的具有商業價值的資料
4、非法轉賬
5、強制傳送電子郵件
6、網站掛馬
7、控制受害者機器向其它網站發起攻擊

最簡單地處理以上的問題,只需要在接受資料處理的時候用上過濾函式htmlspecialchars,這個函式會把程式碼中的特殊字元轉義成HTML實體,輸出的時候就不會影響頁面了

<?php
        echo htmlspecialchars($_POST
['content']); ?>

還有一種方法是直接過濾掉html標籤,這裡要用到正則表示式

<?php
        // echo htmlspecialchars($_POST['content']);
        $rege = '/<\/?[^>]+>/';
        $result = preg_replace($rege,"",$_POST['content']);
        echo $result;

    ?>

PHP提供了一個內建的strip_tags函式可以出去字串中HTML和PHP標籤,僅保留引數中指定的標籤

<?php

        $str = '<p>Test parjlkasdf </p><a href="#test">Other text</a>';
        echo strip_tags($str);
        echo "</br>";
        echo strip_tags($str,'<p> <a>');//允許p標籤和a標籤
    ?>

這裡寫圖片描述