當前位置: 首頁>>技術問答>>正文


在PHP中,如何防止代碼注入攻擊?

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字節)。

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) 。

注入攻擊

參考資料

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3741.html,未經允許,請勿轉載。