我們希望允許「正常」的href鏈接到其他網頁,但我們不希望任何人偷偷進入客戶端腳本。從HREF中刪除Javascript
正在HREF和onclick/onmouseover/etc中搜索「javascript:」。事件足夠好嗎?或者還有其他事情要檢查嗎?
我們希望允許「正常」的href鏈接到其他網頁,但我們不希望任何人偷偷進入客戶端腳本。從HREF中刪除Javascript
正在HREF和onclick/onmouseover/etc中搜索「javascript:」。事件足夠好嗎?或者還有其他事情要檢查嗎?
聽起來好像你允許用戶使用標記提交內容。因此,我建議看一看關於防止跨站點腳本的一些文章,這些文章可能會比簡單地阻止JavaScript被插入到HREF標記中。下面是一個我發現,可能是有用的:
http://weblogs.java.net/blog/gmurray71/archive/2006/09/preventing_cros.html
您必須使用允許的協議白名單才能完全安全。如果你使用黑名單,遲早你會錯過像「telnet://」或「shell:」或某種可以利用的瀏覽器特定的事情,你從來沒有聽說過...
不,有一個你需要檢查更多。
可以對URL的第一個進行編碼(使用HTML實體或URL編碼或兩者的混合)。
其次,你需要檢查畸形的HTML,該瀏覽器可能在猜測,並最終允許在某些腳本。
第三,你需要檢查基於CSS腳本,例如背景:url(javascript:...)或width:表達式(...)
可能還有更多的我錯過了 - 你需要小心!
你不得不在用戶輸入時要非常小心。你會想要做一個白名單,但不僅僅是href。例如:
<img src="nosuchimage.blahblah" onerror="alert('Haxored!!!');" />
或
<a href="about:blank;" onclick="alert('Haxored again!!!');">click meh</a>
一個辦法是在所有禁止html和使用相同的排序格式,一些論壇使用。只需更換
[url="xxx"]yyy[/url]
與
<a href="xxx">yyy</a>
這會讓你周圍的鼠標等問題,然後,只需確保鏈接開始了與列入白名單協議,沒有引號("
或某些可能被php或瀏覽器解密的文件)。
聽起來就像您正在尋找PHP的strip_tags
的伴侶功能,即strip_attributes
。不幸的是,它還沒有被寫入。 (提示提示。)
有,但是,strip_tags
文檔,在這裏一個有趣的前瞻性建議:
http://www.php.net/manual/en/function.strip-tags.php#85718
理論上,這將剝奪任何不是一個href,類或ID從提交鏈接;好像你可能想要進一步鎖定它,只需要hrefs。