要防止SQL注入,是否有必要在magic_quotes_gpc
打開時使用mysql_real_escape_string()
?當magic_quotes_gpc打開時,是否有必要使用mysql_real_escape_string()?
回答
對於一些罕見的編碼,such as GBk - 是的。
但是你應該恢復它不是因爲這個原因。無論如何,魔術引號都應該關閉(並且將在下一個PHP版本中)。所以,mysql_real_escape_string()是唯一的離開函數。請注意,它不是SQL注入預防功能。許多人不明白這一點:它只是語法的一部分。必須使用它不是爲了「保護」任何東西,而是爲了彙編語法上正確的SQL查詢。無論數據來自何處,每次構建查詢時都必須使用它。當然,它也會保護你免受SQL注入,這是一種副作用。
當然,mysql_real_escape_string()
只適用於引用的字符串。所以,如果你這樣做
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!
它將保護什麼。 如果你要使用數字不帶引號的,它必須被強制轉換爲正確的類型必須做的,是這樣的:
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
- 請記住,莫使
mysql_real_escape_string()
作品如預期,適當的客戶端編碼應設置,並有可能只有與mysql_set_charset()
功能,SET NAMES查詢不會設置。
如果你想擺脫所有這些複雜的,你可以使用prepared statements,但你需要切換你的mysql驅動程序的mysqli或PDO。
請注意,沒有正確的語法和準備好的語句不會幫助您使用文字以外的查詢部分。你不能逃避標識符或操作符。如果你碰巧動態地使用這些部件,他們必須在腳本中硬編碼,這樣(的ORDER BY子句):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";
或本(WHERE子句)
$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";
謝謝Col,非常詳細。 – Zack 2010-04-09 07:01:24
是它的好習慣,通過過濾器mysql_real_escape_string()運行所有進入你的sql語句的值,它不僅僅是過濾器正在修復的引號。
它可以防止注入攻擊,請參閱php手冊中有關該方法的示例。
http://php.net/manual/en/function.mysql-real-escape-string.php
縱觀文件; http://php.net/manual/en/function.mysql-real-escape-string.php
注意:如果啓用了magic_quotes_gpc,請先將stripslashes()應用於數據。對已經被轉義的數據使用這個函數會將數據轉移兩次。
您可以檢查magic_quotes_gpc是否開啓,請參閱示例; http://php.net/manual/en/function.get-magic-quotes-gpc.php
不,是的。如果magic_quotes
已打開並且應用了mysql_real_escape_string
,則某些轉義將會加倍,這會導致在某些論壇上看到「It\'s an example.
」之類的內容。要獲得最佳做法,應該禁用magic_quotes
並始終使用mysql_real_escape_string
,或者甚至更好地使用數據庫抽象庫。
- 1. 使用預準備語句時,mysql_real_escape_string()是否必要?
- 2. 是否有必要使用mysql_real_escape_string()將圖像轉換爲mysql?
- 3. 我們在使用會話時是否必須使用mysql_real_escape_string()?
- 4. 使用SVM時,TF-IDF是否必要?
- 5. 當使用mysql_real_escape_string?
- 6. 當使用alter table時,是否有必要使用mysql真正的逃脫?
- 7. 是否有必要使用xlib的「XAllocSizeHints()」?
- 8. 是否有必要使用addTestDevice?
- 9. 是否有必要使用InitCommonControlsEx()和InitCommonControls()?
- 10. 使用Parse Server時,我是否必須打開終端?
- 11. 是否有必要有base64_encode
- 12. 如果我綁定參數,是否必須使用mysql_real_escape_string?
- 13. 當使用MVC時,是否有必要創建一個單獨的視圖類?
- 14. 當使用NSMainQueueConcurrencyType時,是否有必要在performBlock中執行Core Data讀取?
- 15. 當顯式確認郵件時,ActiveMQ使用者是否需要打開?
- 16. 使用Ember.js時,是否有必要構建Rails視圖?
- 17. 我是否必須更改所有的htmlspecialchars ... mysql_real_escape_string中的ENT_QUOTES?
- 18. 當我有svn @ sourceforge時,是否必須使用maven倉庫?
- 19. 當它必須阻止UI時使用SwingWorker是否有益?
- 20. PHP 5.3 magic_quotes_gpc打開但不工作
- 21. 是否有用於postgresql的PHP mysql_real_escape_string?
- 22. 打開圖表 - XMLNS是否必需?
- 23. 調用ZipArchive :: close() - 是否有必要?
- 24. 線程是否必要/有用?
- 25. 是否有必要調用ApplicationContext.start
- 26. 循環引用是否有必要?
- 27. 是否有必要使用Throwables.propagate(e)使用throw關鍵字?
- 28. 如果使用validates_length_of,validates_presence_of是否必要?
- 29. Cordova.js是否必要?
- 30. _mmServerScripts是否必要?
是不是mysql_real_escape_string將數據插入MySQL時最適合?你應該使用magic_quotes_gpc來保證一般的安全。 – ggfan 2010-04-07 03:37:15