php XSS攻擊原理與防禦
阿新 • • 發佈:2019-01-08
資料安全是軟體設計中要考慮的問題,在程式中保持資料的安全,除了保證程式碼內部執行的可靠,最主要就是嚴格控制外部資料,秉持一切使用者輸入的都是不可靠的原則,做好資料的驗證和過濾.
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標籤
?>