爲什麼在PHP中啓用magic_quotes_gpc被認爲是不好的做法?爲什麼把magic_quotes_gpc視爲一種不好的做法?
回答
我不認爲我能解釋它比任何PHP本身的製造商更好的(與網頁後續評論):Why not to use Magic Quotes
- 可移植性:假設它是或熄滅,影響了便攜性。使用
get_magic_quotes_gpc()
檢查這一點,並相應地編碼。 - 性能:因爲不是每一個轉義數據都插入到數據庫中,轉義所有這些數據會導致性能損失。只需在運行時調用轉義函數(如
addslashes()
)就更有效。儘管php.ini-development在默認情況下啓用了這些指令,但php.ini-production會禁用它。這個建議主要是由於性能原因。 - 不便之處:因爲不是所有的數據都需要轉義,所以看到轉義的數據不應該出現的時候通常很煩人。例如,通過電子郵件發送表單,並在電子郵件中看到一堆「\」。要解決這個問題,可能需要過度使用
stripslashes()
。
注意:此功能在PHP 5.3.0和PHP 5.4.0以前已被刪除。
即使將數據_is_插入到數據庫magic \ _quotes \ _gpc/addslashes中也可能無法實現。 – VolkerK 2010-04-09 20:06:28
根據文章What is Magic Quotes GPC (magic_quotes_gpc) in PHP and the php.ini?,也有許多缺點:其中表單提交被髮送回瀏覽器必須()與呼叫手動移除的stripslashes斜線
- 案件。
- 如果此服務器的魔術引號被關閉,或者代碼被移動到未啓用魔術引號的服務器,則您的腳本將失敗。或者更糟的是,不會立即失敗,只會表現出奇怪的行爲
- 對提交的變量進行任何字符串操作,即使是簡單的'if'語句都必須考慮到內容中的斜槓變形的可能性。
- 魔術引號引起開發者的sl。。插入到SQL查詢中的轉義變量(在我看來)是開發人員應該知道並思考的東西。不僅僅是假設一切都是華麗的。
因爲有人可以將您的腳本移動到未啓用該選項的服務器,因此在應用程序中立即打開數百個安全漏洞。另外,太多認爲啓用魔術引號會使您的應用程序安全。它不是。您仍然需要檢查並驗證進入應用程序的每一個輸入。即使您沒有報價問題,仍然可能存在跨站點腳本問題等。
即使未來版本的PHP中正在刪除該功能的事實。
「Magic Quotes」是PHP手頭持有的嘗試,防止開發人員在不知情的情況下用SQL注入自己的腳步。它棄用PHP 5.3,並且將在PHP被刪除6.
我說,最好是明確和逃生需要轉義,而不是逃避一切並有反轉義的事情,永遠不會被放在什麼數據庫。魔術報價創造了很多(或更多)問題,而不是解決問題,試圖屏蔽那些應該更好地瞭解的人。
因爲離開它脫力你寫出更安全的代碼。
如果O'Malley先生在您的網站上註冊,那麼magic_quotes_gpc會將他的姓氏變成O \'Malley,並且當您將其插入到數據庫中時,一切都會好起來的。
問題是,magic_quotes來自addslashes--它不一定會作爲數據庫系統的轉義工作。 O'Malley可能會工作,但也可以規避這種逃跑並執行SQL注入。
如果magic_quotes的都沒有,那麼你會得到字符串奧馬利,這將打破SQL語句像
INSERT INTO users (...) VALUES (...,'O'Malley',...)
通知的字符串是O.
後真的終止此外,它更好:例如,如果您要用他的名字發送電子郵件,則必須使用反斜槓 - 沒有理由。如果你不知道,你會收到O'Malley先生的電子郵件。 (當然,對於真正安全的數據庫處理代碼,你會希望使用參數化查詢,因爲這是防止SQL注入的最佳方法,而且如果你參數化,你不需要斜槓,並且這是浪費時間讓PHP添加它們。)
很容易的問題。
想象一下,你想通過電子郵件發送用戶的數據。或者將cookie中的用戶名插入到表單輸入中。你覺得像鮑勃「布法羅」比爾這樣的名字會是個好主意嗎?我不這麼認爲
- 1. Javascript爲什麼FOR IN是一種不好的做法?
- 2. 爲什麼-compile(export_all)不好的做法?
- 3. 爲什麼在HTML中使用onClick()是一種不好的做法?
- 4. 爲什麼從javascript連接SQL數據庫是一種不好的做法?
- 5. 爲什麼$在cakePHP中被認爲是不好的做法?
- 6. 哪種方法簽名好,爲什麼?
- 7. 哪種方法更好,爲什麼?
- 8. 爲什麼是一種「不穩定的那種」認爲是不好的
- 9. 您是否認爲ASP.NET WebForms是一種不好的做法?
- 10. 爲什麼在JavaScript中使用if(myBoolean === true)是一種好的做法?
- 11. 爲什麼Powershell不把我的文件視爲格式良好的XML文檔?
- 12. 爲什麼把所有的html放在一行上都不好?
- 13. 爲什麼在bean中創建受保護的屬性被認爲是一種不好的做法?
- 14. 爲什麼關閉Angular的良好做法? (或一般)?
- 15. 將幾種形式縮減爲1種形式。好的或不好的做法?
- 16. 不好的做法?它是什麼「稱爲」
- 17. 爲什麼從模塊導入*使用不好的做法?
- 18. 爲什麼在C++的函數中創建一個對象是一種不好的做法?
- 19. 爲什麼不把UIViewController的視圖鍵入爲id?
- 20. 從文件中讀取。哪一種方法更好,爲什麼?
- 21. 爲什麼QWebFrame :: evalutateJavaScript在這種情況下什麼都不做?
- 22. 傳遞變量另一種觀點認爲:最好的做法
- 23. 將變量聲明爲'var'是一種好的做法嗎?
- 24. 將變量設置爲「Nothing」是一種很好的做法?
- 25. 使用Firebase Auth user.uid作爲url的一部分是一種不好的做法?
- 26. 爲什麼Visual Studio中的循環引用是一個不好的做法?
- 27. 鎖定可變對象 - 爲什麼它被認爲是不好的做法?
- 28. 這是爲什麼認爲是不好的做法?還是它? (ASP.Net)
- 29. 爲什麼重載operator <作爲成員函數是不好的做法?
- 30. 爲什麼認爲會話範圍對象可序列化是一種很好的做法?
嗯..因爲它在PHP6.0中被刪除,並且從PHP5.3開始被棄用了呢? :P – 2010-04-09 20:04:38
@Noah Goodrich:這是一個雞與雞蛋的問題。該功能是否被刪除,因爲開始時是不好的做法?大多數人可能會認爲是。 – 2010-04-09 20:07:08
@Noah Goodrich是「可能」,或者你確定? – 2010-04-09 20:10:06