正確理解PHP轉義的真正含義
如何正確的理解PHP轉義是一個初學者比較困擾的問題。我們今天為大家簡要的講述了PHP轉義的具體含義,希望有所幫助。PHP轉義一直困擾著我, 今天認真的看了一下PHP手冊, 終于解決了.#t#
在PHP中默認有一個"魔術引號"的開關, 如果這個開關打開, 從外部轉入的$_GET, $_GET, $COOKIE都會PHP轉義.
比如:
http://localhost/test.PHP?test=1'
然后在test.PHP輸出時自動轉義, 輸出如下:
var_dump($_GET['test'];
========output=======
string(3) "1\'"
所示 ' 號被加入了\轉義了.但這里有一個問題, 當將這個值輸出到網頁時會看到滿屏的\, 這里可以使用另一個函數, stripslashes 可以將\去除.
在手冊中的PHP轉義意思是說推薦不要開啟"魔術引號" 因為效率問題, 不這也有一個好處, 就是可以非常安全, 對于我這樣的新手來說.
關閉"魔術引號有三個方法, 因為這個是不可以PHP運行進關閉的, 也就是說不可以用ini_set().
1. 對PHP.ini設置.
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
2. 如果對系統無法修改可以使用 .htaccess
PHP_flag magic_quotes_gpc Off
3. 效率***的PHP轉義方法
- if (get_magic_quotes_gpc()) {
- function stripslashes_deep($value)
- {
- $value = is_array($value) ?
- array_map('stripslashes_deep', $value) :
- stripslashes($value);
- return $value;
- }
- $_POST = array_map('stripslashes_deep', $_POST);
- $_GET = array_map('stripslashes_deep', $_GET);
- $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
- }
- ?>
這里還要提到一個關于 SQL語句中有LIKE時對%的處理, 因為addslashes對% _ 是不轉義的, 且這兩個字符在別的SQL語句也本來也不用轉義的, 所以我編了一個函數 like_esc($value), 當有LIKE語句時才使用.
對于輸出到網頁的先用stripslashes去\還要用htmlspecialchars轉義一下.
我現在有一個比較懶的PHP轉義方法也是對所有轉入的都轉義.
- if (!get_magic_quotes_gpc()) {
- function addslashes_deep($value)
- {
- $value = is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
- return $value;
- }
- $_POST = array_map('addslashes_deep', $_POST);
- $_GET = array_map('addslashes_deep', $_GET);
- $_COOKIE = array_map('addslashes_deep', $_COOKIE);
- }