PHP中有這麽多函數,我對這些函數的使用感到很混亂。有人使用:htmlspecialchars()
,htmlentities()
,strip_tags()
等
哪一個是正確的,大家通常使用什麽呢?
下麵這行應該是正確的(如果有更好的請給我建議):
$var = mysql_real_escape_string(htmlentities($_POST['username']));
這一行可以防止MySQL注入和XSS的攻擊
順便說一下,除了XSS攻擊和MySQL注入之外,還有什麽其他的事情需要注意嗎?
總結:
如果我想插入字符串到數據庫,我不需要使用htmlentities
,隻需使用mysql_real_escape_string
。當顯示數據時,使用htmlentities()
,是這樣的嗎?
總結:
-
mysql_real_escape_string
插入數據庫時使用 -
將數據輸出到網頁時使用的
htmlentities()
-
htmlspecialchars()
用在什麽時候? -
strip_tags()
用在什麽時候? -
addslashes()
用在什麽時候?
有人可以解答上麵的疑問嗎?
最佳解決思路
mysql_real_escape_string used when insert into database
htmlentities() used when outputting data into webpage
htmlspecialchars() used when??
strip_tags() used when ??
addslashes() used when ??
htmlspecialchars()用在什麽時候?
htmlspecialchars與htmlentities大致相同。區別:字符編碼。
都編碼控製字符,如<
,>
,&
等用於打開標簽等。htmlentities還編碼其他語言,如變音符號,euro-symbols等字符。如果您的網站是utf,請使用 htmlspecialchars(),否則使用 htmlentities()。
什麽時候使用strip_tags()?
htmlspecialchars /實體編碼的特殊字符,所以他們顯示,但不解釋。 strip_tags將其移除。
在實踐中,這取決於你需要做什麽。
一個例子…你已經編寫了一個論壇,並給用戶一個文本字段,所以他們可以發布的東西。惡意的隻是嘗試
pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here
如果你什麽都不做,鏈接將被顯示,點擊鏈接的受害者將得到大量的pop-ups。
如果你的輸出是htmlentitiy /htmlspecialchar,那麽文本會在那裏as-is。如果你strip_tag它,它隻是刪除標簽,並顯示它:
pictures of kittens here
有時你可能想要一個混合,在那裏留下一些標簽,如<b>
(strip_tags可以在那裏留下一些標簽)。這也是不安全的,所以最好使用一些對xss的完整庫
addslashes
引用php手冊:
在需要在數據庫查詢中引用的字符之前返回帶反斜杠的字符串
這些字符是單引號(’),雙引號(“),反斜杠()和NUL(NULL字節)。 p>addslashes()的一個例子是當你輸入數據到數據庫。例如,要將O’reilly這個名字插入到數據庫中,你需要將它轉義出來,它強烈建議使用DBMS特定的轉義函數(例如MySQL的mysqli_real_escape_string()或PostgreSQL的pg_escape_string()),但是如果你使用的DBMS沒有轉義函數,而DBMS使用\來轉義特殊字符,你可以使用這個函數。
次佳解決思路
隻有在進入係統需要進行編碼時才對數據進行編碼 – 否則會遇到您想操縱實際數據的情況。
對於SQL注入 – 使用How can I prevent SQL injection in PHP?中描述的綁定變量(它談論準備好的語句,但它是給予保護的綁定,而不是準備)。
對於XSS – 如果您在指定HTML或文本的位置寫入HTML。在生成文檔的地方使用htmlentities。我會避免以數據庫的形式存儲數據(除了可能在write-rare-read-通常係統的CPU性能/磁盤訪問時間成為問題 – 然後我將有一個raw_和html_版本的列…或隻是使用memcached或類似的)。
如果你讓用戶輸入URL,那麽你需要更加小心,因為javascript:do_evil()
是一個有效的URI將被執行(例如作為一個點擊鏈接的href或(在某些瀏覽器中)剛加載的圖像的src) 。