php中什麼是魔術引號

2020-07-16 10:05:36

什麼是魔術引號:

魔術引號是程式自動將進入PHP指令碼的資料進行轉意的過程。當開啟時,所有的 '(單引號),"(雙引號),(反斜線)和 NULL 字元都會被自動加上一個反斜線進行跳脫。和 addslashes() 函數的作用完全相同。

魔術引號指令:

magic_quotes_gpc 影響到 HTTP 請求資料(GET,POST 和 COOKIE)。不能在執行時改變。在 PHP 中預設值為 on。 參見 get_magic_quotes_gpc()。

magic_quotes_runtime 如果開啟的話,大部份從外部來源取得資料並返回的函數,包括從資料庫和文字檔案,所返回的資料都會被反斜線跳脫。該選項可在執行的時改變,在 PHP 中的預設值為 off。 見 set_magic_quotes_runtime() 和 get_magic_quotes_runtime()。

magic_quotes_sybase 如果開啟的話,將會使用單引號對單引號進行跳脫而非反斜線。此選項會完全覆蓋 magic_quotes_gpc。如果同時開啟兩個選項的話,單引號將會被跳脫成 ''。而雙引號、反斜線 和 NULL 字元將不會進行跳脫。 如何取得其值參見 ini_get()。

魔術引號作用:

當初引入魔術引號是安全方面的考慮,阻止SQL隱碼攻擊,它能幫助php新手在不知不覺中寫成相對更安全的程式碼,不過在今天,程式設計師已經能很好的意識到了這個安全問題,並最終使用資料庫轉移機制或者 prepared 語句來取代魔術引號功能。

魔術引號缺陷:

可移植性 :程式設計時認為其開啟或並閉都會影響到移植性。可以用 get_magic_quotes_gpc() 來檢查是否開啟,並據此程式設計。

效能: 由於並不是每一段被跳脫的資料都要插入資料庫的,如果所有進入 PHP 的資料都被跳脫的話,那麼會對程式的執行效率產生一定的影響。在執行時呼叫跳脫函數(如 addslashes())更有效率。 儘管 php.ini-dist 預設開啟了這個選項,但是 php.ini-recommended 預設卻關閉了它,主要是出於效能的考慮。

不便: 由於不是所有資料都需要跳脫,在不需要跳脫的地方看到跳脫的資料就很煩。比如說通過表單傳送郵件,結果看到一大堆的 '。針對這個問題,可以使用 stripslashes() 函數處理。

開關魔術引號:

magic_quotes_gpc 是不能通過ini_set()的來設定的,設定magic_quotes_gpc有三種方法。

1、修改PHP組態檔php.ini。這種方法需要對伺服器有管理許可權才能修改,如果只是虛擬空間就只能使用後面兩種方法。

; Magic quotes
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = Off
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.
magic_quotes_runtime = Off
Use Sybase-style magic quotes (escape ' with '' instead of ').
Magic_quotes_sybase = Off

2、在htaccess中設定。只有伺服器支援htaccess的情況下這種才能使用,

php_flag magic_quotes_gpc Off

3、程式碼中遮蔽。這種方法的移植性較強,但是效率最低,所以在有伺服器管理許可權的時候通過修改設定文章的方式關閉magic_quotes_gpc是最好的。

範例程式碼:

<?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);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
?>

總結:

當初是為了阻止SQL隱碼攻擊的需要引入了魔法引號,對於開發者有一定好的好友,但在使用的時候也帶來很多的不便,現在有了更多更好的方案來替代,所以如果還是在php 5.3.0或php 5.3.0之前的版本做開發應該盡量避免使用魔法引號,php 5.4.0以後已經移除了。

以上就是php中什麼是魔術引號的詳細內容,更多請關注TW511.COM其它相關文章!