程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php中magic_quotes_gpc函數一些用法

php中magic_quotes_gpc函數一些用法

編輯:關於PHP編程

magic_quotes_gpc方法是根據你php.ini配置來的,如果打開了magic_quotes_gpc就生成,他的作用與addslashes是一樣的,下面我來詳細介紹一下關於magic_quotes_gpc用法。  

看了thinksaas部分源碼,發現對$_POST/$_GET過來的數據處理方法是通過函數Add_S()進行的,即環境默認沒有開啟magic_quotes_gpc,就對提交過來的數據進行addslashes()處理。

一直對magic_quotes_gpc感到疑惑,前面我也有發過對magic_quotes_gpc的文章《magic_quotes_gpc和addslashes()的正確關系?》,現在再談這個問題,就是想徹底搞明白這個東西,我已經在thinksaas官網提交了這個問題,等候答復,到時我把結果更新到本文。
問題1:現在要讀取數據裡的數據是不是讀取後要進行stripslashes()處理,才能還原到原來的本來的數據狀態?

問題2:我看很多其他程序都是反過來處理的,即如果環境開啟magic_quotes_gpc了,就對提交過來的數據進行stripslashes()處理,然後再對數據進行htmlspecialchars()處理去替換掉那些特殊符號,我想問這種方法和thinksaas的處理方法哪種好?聽說magic_quotes_gpc以後默認是不開啟的。

typecho火車頭發布接口,我處理post過來的數據就是采用問題2中的方法,不知道是不是最好的方法?

 

對提交過來的數據進行stripslashes()處理,然後再對數據進行htmlspecialchars()--這種方法我想沒有啥優點吧。相比還是TS的好。如果特別點的網站,比如微博之類格式很少的,我看只須addslashed()就行,然後直接入庫最好。
問題1沒有人回答,不過我在這裡可以自己回答,無論開沒開magic_quotes_gpc,讀取數據後都不需要再進行stripslashes()處理,因為保存的時候數據並沒有加上額外的反斜線。

magic_quotes_gpc總結

1、處理方法

方法一:如果系統環境沒有開啟magic_quotes_gpc,就對提交過來的數據進行addslashes()處理。
方法二:如果系統環境開啟magic_quotes_gpc,就對提交過來的數據進行stripslashes()處理,最後再對數據進行htmlspecialchars()處理去掉那些特殊符號。

2、最好的方法如那個兄弟說的一樣,簡單的入庫就直接addslashed()後入庫就可以了;如果需要對字符串進行比較復雜的處理後再入庫,一般需要先去掉magic_quotes_gpc自動添加的反斜線,然後進行字符串的處理,處理完後再addslashed()或者htmlspecialchars()處理,最後入庫。雖然一般是這樣,但是還是要根據實際靈活采取方法的。

2012-10-21日更新

最最好的方法是:去掉magic_quotes_gpc自動添加的反斜線,然後在數據庫操作類裡把所有入庫的操作都先addslashed(),再入庫


現在看看官方操作怎麼說的


先看下手冊上怎麼說的吧!

對一般人來說看下前兩段就可以了

Magic Quotes

代碼:
Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed.
What are Magic Quotes


代碼:
When on, all ' (single-quote), " (double quote), (backslash) and NULL characters are escaped with a backslash automatically. This is identical to what addslashes() does.

There are three magic quote directives:
magic_quotes_gpc

代碼:
Affects HTTP Request data (GET, POST, and COOKIE). Cannot be set at runtime, and defaults to on in PHP.
magic_quotes_runtime

代碼:
If enabled, most functions that return data from an external source, including databases and text files, will have quotes escaped with a backslash. Can be set at runtime, and defaults to off in PHP.
magic_quotes_sybase

代碼:
If enabled, a single-quote is escaped with a single-quote instead of a backslash. If on, it completely overrides magic_quotes_gpc. Having both directives enabled means only single quotes are escaped as ''. Double quotes, backslashes and NULL's will remain untouched and unescaped.
Why use Magic Quotes

 


1 Useful for beginners

Magic quotes are implemented in PHP to help code written by beginners from being dangerous. Although SQL Injection is still possible with magic quotes on, the risk is reduced.

2Convenience

For inserting data into a database, magic quotes essentially runs addslashes() on all Get, Post, and Cookie data, and does so automagically.


Why not to use Magic Quotes

 


1 Portability

代碼:
Assuming it to be on, or off, affects portability. Use get_magic_quotes_gpc() to check for this, and code accordingly.
2 Performance

代碼:
Because not every piece of escaped data is inserted into a database, there is a performance loss for escaping all this data. Simply calling on the escaping functions (like addslashes()) at runtime is more efficient.

Although php.ini-dist enables these directives by default, php.ini-recommended disables it. This recommendation is mainly due to performance reasons.
3 Inconvenience

代碼:
Because not all data needs escaping, it's often annoying to see escaped data where it shouldn't be. For example, emailing from a form, and seeing a bunch of ' within the email. To fix, this may require excessive use of stripslashes().
這些英文實在是需要像我這類人有足夠的耐心啊(不是說我有耐心,而是我英語爛),剛才也說了,對於一般人只看下前兩段就可以了,特別是我用紅色標出來的字!!!

get_magic_quotes_gpc

取得 PHP 環境變數 magic_quotes_gpc 的值。

語法: long get_magic_quotes_gpc(void);

傳回值: 長整數

函式種類: PHP 系統功能

內容說明


本函式取得 PHP 環境設定的變數 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。傳回 0 表示關閉本功能;傳回 1 表示本功能開啟。當 magic_quotes_gpc 開啟時,所有的 ' (單引號), " (雙引號), '' (反斜線) and 空字符會自動轉為含有反斜線的溢出字符。

addslashes -- 使用反斜線引用字符串

描述
string addslashes ( string str)

返回字符串,該字符串為了數據庫查詢語句等的需要在某些字符前加上了反斜線。這些字符是單引號(')、雙引號(")、反斜線('')與 NUL(NULL 字符)。

一個使用 addslashes() 的例子是當你要往數據庫中輸入數據時。例如,將名字 O'reilly 插入到數據庫中,這就需要對其進行轉義。大多數據庫使用 '' 作為轉義符:O'''reilly。這樣可以將數據放入數據庫中,而不會插入額外的 ''。當 PHP 指令 magic_quotes_sybase 被設置成 on 時,意味著插入 ' 時將使用 ' 進行轉義。

默認情況下,PHP 指令 magic_quotes_gpc 為 on,它主要是對所有的 GET、POST 和 COOKIE 數據自動運行 addslashes()。不要對已經被 magic_quotes_gpc 轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函數 get_magic_quotes_gpc() 進行檢測。

例子 1. addslashes() 示例

 代碼如下 復制代碼

$str = "Is your name O'reilly?";

// 輸出:Is your name O'''reilly?
echo addslashes($str);
?>

get_magic_quotes_gpc()
本函數取得 PHP 環境配置的變量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示關閉本功能;返回 1 表示本功能打開。當 magic_quotes_gpc 打開時,所有的 ' (單引號), " (雙引號), '' (反斜線) and 空字符會自動轉為含有反斜線的溢出字符。

 代碼如下 復制代碼

function html($str) {
$str = get_magic_quotes_gpc()?$str:addslashes($str);
return $str;
}

總結如下:

1. 對於PHP magic_quotes_gpc=on的情況,

我們可以不對輸入和輸出數據庫的字符串數據作
addslashes()和stripslashes()的操作,數據也會正常顯示。

如果此時你對輸入的數據作了addslashes()處理,
那麼在輸出的時候就必須使用stripslashes()去掉多余的反斜槓。

2. 對於PHP magic_quotes_gpc=off 的情況

必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()格式化輸出
因為addslashes()並未將反斜槓一起寫入數據庫,只是幫助mysql完成了sql語句的執行。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved