2013-05-09 48 views
0

我有一個網站,用戶可以分享一個鏈接到他們的主頁,如http://example.com/user。目前,我正在使用PHP函數filter_var($_POST['url'], FILTER_VALIDATE_URL)在使用預準備語句將其添加到數據庫之前驗證URL。如何在PHP中正確處理URL鏈接?

但是,我意識到PHP過濾器函數接受可用於跨站點腳本的輸入,如http://example.com/<script>alert('XSS');</script>。爲了解決這個問題,我在標籤的<a>標籤內使用htmlspecialchars,在標籤的href屬性上使用rawurlencode

rawurlencode導致URL中的/轉換爲%2f,這使URL無法識別。我正在考慮爲所有%2f做一個preg_replace回到/。這是消除URL顯示爲鏈接的方式嗎?

+0

你有沒有考慮strip_tags()? – Robert 2013-05-09 12:37:07

+0

@RobertPodwika,感謝您的建議。我會仔細看看的。 – 2013-05-09 12:40:18

回答

0

消毒後,URL使用,XSS相關的腳本,只是改變使用

str_replace('%2f', '/', $result)%2f字符的代碼之後,但之前filter_var(),它會改回其原有的特色。所以,你的腳本可以繼續。

+0

這只是問題的一部分。 urlencode也會破壞其他角色。所以,使用urlencode的整個方法是錯誤的。 – 2013-05-09 12:39:41

0

不允許帶有標籤的網址。

向網址插入標籤意味着它可能是惡意的。 擁有包含標籤的「主頁」是錯誤的。

2

這是現在已經過時:

我使用PHP函數filter_var($ _ POST [ 'URL'], FILTER_VALIDATE_URL)用事先準備好的聲明將它添加到數據庫 之前驗證URL。

而不是FILTER_VALIDATE_URL

您可以使用下面的技巧:

$url = "your URL" 
$validation = "/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i"; 
if((bool)preg_match($validation, $url) === false) 
    echo 'Not a valid URL'; 

我認爲它可能對你的作品。所有最好的:)