2010-01-12 40 views
8

的URL將被什麼是「足夠消毒」的URL

  1. 保存到MySQL數據庫
  2. 用於顯示用戶的個人資料圖片

將用strip_tags()和mysql_real_escape_string()就夠了嗎?

+1

我收到了類似問題的一些很好的答案;如果您願意,請查看http://stackoverflow.com/questions/549987/what-is-the-best-way-to-filter-urls-for-input。正如Mike Boers的回答所建議的,最好的解決方案可能是徹底重建URL。 – JAL 2010-01-12 02:33:54

回答

16

「足夠的消毒」完全取決於你在說什麼環境。 MySQL的消毒應該被認爲是完全獨立的免於網絡輸出的消毒,您應該單獨處理它們以避免很多麻煩。

消毒的MySQL

  • mysql_real_escape_string()將消毒一塊數據並使其安全地把一個SQL查詢中。
  • 任何其他類型的惡意數據(如字符串內的HTML標籤)都應該被完全忽略。試圖在這裏操縱它會導致你頭痛,因爲你試圖在將它從數據庫中取出後「解除」它。錯誤的「網絡數據」不能損害您的數據庫。

消毒輸出

  • htmlspecialchars($val)在輸出時將防止渲染任何惡意代碼,因爲<>字符轉換爲它們的實體表示而不是呈現爲標籤分隔符。
  • 如果你輸出的東西是一個HTML元素的引用屬性中,如<input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />

這應該是你所需要的,除非你有特殊要求使用ENT_QUOTES修改。 strip_tags()不應該真的用於消毒,因爲它可能被形成不良的HTML愚弄。消毒是一個有價值的目標,如果你可以保持你的上下文分離,你將遇到更少的數據操作問題。

+1

+1在需要時進行消毒。當然,對SQL進行消毒是*邪惡的*,只是使用參數化查詢... – sleske 2010-01-12 03:04:08

+0

@sleske - 是的,這是目前流行的觀點。對SQL進行消毒不是壞事。許多系統將使用較舊的數據庫版本或驅動程序,並且可能無法訪問MySQLi。消毒得到糟糕代表的唯一原因是因爲人們*忘記了這樣做*。準備好的查詢只是抽象出手動清理(除其他優點外)。 – zombat 2010-01-12 03:18:37

+0

你是什麼意思「參數化查詢」? – aslum 2010-01-12 03:20:32

1

在字符串上調用htmlentities()而不是在strip_tags()上計算可能更安全和更好。

用strip_tags()將不會刪除HTML特殊字符像'"&

例如,如果你的代碼是:

<img src="<?= strip_tags($myVar) ?>"> 

$myVar = '">something goes here<'; 

那麼你結束了:

<img src="">something goes here<"> 

這顯然是XSS洞的根;一個實際的漏洞被留下來作爲讀者的練習。

0

我最初upvoted弗蘭克的答案,但想到一個問題:ヶ輛()將打破合法的URL是這樣的:

http://www.mywebsite.com/profile?id=jojo&w=60&h=60

也許剝尖括號+ mysql_real_escape就足夠了?

+0

儘管圖像網址中不應該包含&符或它們? – aslum 2010-01-12 02:39:41

+0

爲什麼不呢?腳本是完全有效的圖像源。 – 2010-01-12 02:40:40

+2

htmlentities()將在該URL上正常工作。事實上,標準要求在您的屬性中編碼&&。 ''是有效的html(並且瀏覽器將按照預期將URL作爲'example.com/?a&b'來執行)。另一方面''是無效的 - 但瀏覽器無論如何可能會做的事情。例如,如果您在帖子中的網址上查看源代碼,則會看到SO在href屬性中使用&。 – 2010-01-12 02:44:27