編寫不受魔術引號影響的php應用
原創作品author流水孟春,轉載請註明出處lib.cublog.cn
閱讀前提:你必須看過php手冊上的”第IV部分安全”的”第10章魔術引號”。如果沒看過,也沒問題,現在馬上花10分鐘先看一下php手冊上的這東西。
魔術引號(Magic Quote)是一個自動將進入 PHP 指令碼的資料進行轉義的過程
你可能想讓你的程式相容多個資料庫,但你使用的不同的資料庫可能使用不同的轉義符,而我們的程式又有可能執行在不同的php.ini配置的主機上,關於magic_quotes的配置又可能不一樣,所以編寫不受魔術引號影響的php應用是高相容性的php應用所必須的。
php.ini中有三個魔術引號配置選項:
魔術引號配置選項 | 描述 | 執行時改變 | 在 PHP中的預設值為 |
magic_quotes_gpc | 如果開啟的話,影響到 HTTP 請求資料(GET,POST 和 COOKIE)。 | 不能 | On |
magic_quotes_runtime | 如果開啟的話,大部份從外部來源取得資料並返回的函式,包括從資料庫和文字檔案,所返回的資料都會被反斜線轉義。(前提是magic_quotes_gpc = On) | 能 | Off |
magic_quotes_sybase |
當關閉時,所有的 `(單引號),”(雙引號),/(反斜線)和 NULL 字元都會被自動加上一個反斜線進行轉義。這和 addslashes() 作用完全相同。 |
能 | Off |
但是要處理外部傳來的全域性變數就比較麻煩了。
要處理外部超級變數,我們要看magic_quotes_gpc是否已經開啟(如果magic_quotes_gpc沒開啟,而magic_quotes_sybase開啟,magic_quotes_sybase也不起作用),還要看magic_quotes_sybase是否開啟,再看我們的程式需要對外部變數用addslashes轉義方式還是使用magic_quotes_sybase式的轉義方式。下面的程式碼是一個具體的實現。
有人可能說,當magic_quotes_gpc設成On,而magic_quotes_sybase設成Off,那麼直接用ini_set(`magic_quotes_sybase`, 1);就能讓系統用`來對addslashes式的轉義進行覆蓋。這樣是不行的。你用ini_get(`magic_quotes_sybase`)輸出看下配置,magic_quotes_sybase的確被改變了,但是你的程式碼就是不能用`轉義符覆蓋addslashes式的自動轉義。這是因為系統獲取外部變數的時候,是在你的ini_set(`magic_quotes_sybase`, 1);之前完成的。
<?php
/**
* 解決不受magic_quotes影響的php應用
*
* 使用這個處理辦法需要配置是否使用magic_quotes_sybase, 以適應不同的DBMS
*
* 設定方法:
* $useQuotesSybase[資料庫名] = 1;
* 如:使用sqlite,則定義並初始化 $useQuotesSybase[`sqlite`] = 1;
* 如果使用mysql,可以定義並初始化 $useQuotesSybase[`sqlite`] = 0; 也可以不定義
*
* CONFIG_DB_DBMS 為所用的DBMS的常量, 在別處定義。比如 define(`CONFIG_DB_DBMS`, `mysql`);
*
* @author 流水孟春 cmpan(at)qq.com
* @link http://lib.cublog.cn
* $date 2007.11.18
*/
error_reporting(E_ALL);
set_magic_quotes_runtime(0);
define(`CONFIG_DB_DBMS`, `sqlite`); // 測試用
// 使用 ` 做轉義符的資料庫
$useQuotesSybase = array();
$useQuotesSybase[`sqlite`] = 1;
$useQuotesSybase[`sybase`] = 1;
if(!empty($_POST)) $_POST = array_map(`quotesOuterVars`, $_POST);
if(!empty($_GET)) $_GET = array_map(`quotesOuterVars`, $_GET);
$_COOKIE = array_map(`quotesOuterVars`, $_COOKIE);
$_REQUEST = array_map(`quotesOuterVars`, $_REQUEST);
function quotesOuterVars($var) {
if (is_array($var)) {
return array_map(`quotesOuterVars`,$var);
} else {
if (get_magic_quotes_gpc()) {
if (isset($GLOBALS[`useQuotesSybase`][CONFIG_DB_DBMS]) && $GLOBALS[`useQuotesSybase`][CONFIG_DB_DBMS]) {
// 當前需要以 ` 為轉義符
// 如果 magic_quotes_sybase = Off, 系統將把外部變數 addslashes, 我們得先 stripslashes
// 否則系統自動把 ` 換成 ``,
if (!ini_get(`magic_quotes_sybase`)) {
$var = stripslashes($var);
$var = str_replace("`", "``", $var);
}
} else {
// 當前需要以 / 為轉義符
// 如果 magic_quotes_sybase = On, 我們先把 `` 替換成 `, 然後在 addslashes
// 否則系統自動quotes
if (ini_get(`magic_quotes_sybase`)) {
$var = str_replace("`", "``", $var);
$var = addslashes($var);
}
}
} else{
if (isset($GLOBALS[`useQuotesSybase`][CONFIG_DB_DBMS]) && $GLOBALS[`useQuotesSybase`][CONFIG_DB_DBMS]) {
$var = str_replace("`", "``", $var);
} else {
$var = addslashes($var);
}
}
return trim($var);
}
}
從上面的表我們可以看出,對於magic_quotes_runtime,我在程式中用 ini_set(`magic_quotes_runtime`, 0);就可以把它關掉,然後可以用自己的方法來處理來自資料庫或檔案的資料。
相關文章
- 說說 PHP 的魔術方法及其應用PHP
- GHOST漏洞可能影響WordPress和PHP應用PHP
- 用PHP編寫Android應用程式PHPAndroid
- 讓delphi程式不受WINDOWS日期格式的影響Windows
- offsetTop屬性值不受padding的影響padding
- PHP 魔術方法PHP
- PHP魔術方法PHP
- 編寫安全PHP應用程式的七個習慣PHP
- php 魔術方法 __callPHP
- PHP中的魔術方法和魔術常量簡介和使用PHP
- PHP魔術方法和魔術常量介紹及使用PHP
- PHP 魔術常量簡要PHP
- 專家:微軟拋棄XP 國內ATM不受影響微軟
- php中的魔術常量__FILE__PHP
- oracle中單引號的應用Oracle
- 物聯網技術對移動應用程式開發的影響
- 元宇宙技術對於虛擬模擬應用的影響元宇宙
- 用PHP編寫登陸介面PHP
- GitHub漏洞允許任意程式碼執行,Windows不受影響GithubWindows
- php 物件導向中的魔術方法PHP物件
- PHP中引號的用法PHP
- Web3的應用發展及其影響Web
- 理性遊戲設計應用指南,理解“原子引數”的運作機制和影響!遊戲設計
- PHP中單引號和雙引號的區別PHP
- RAC環境下的SEQUENCE對應用的影響
- PHP中什麼是魔術常量?有哪些魔術常量?(總結)PHP
- php響應PHP
- 編寫高效的MySQL應用(轉)MySql
- 盤點PHP最實用的5大魔術方法及其功能作用PHP
- Go 編寫 Web 應用GoWeb
- PHP 物件導向 (六)魔術方法PHP物件
- 影響FMEA有效應用的因素是什麼?
- mysql開發-動態語句編寫-引號使用MySql
- Stripe Size大小對讀寫的影響
- PHP中對單引號和雙引號的區別(好文)PHP
- 用PHP編寫email群發器 (轉)PHPAI
- 編寫友好的命令列應用程式命令列
- JVM 引數調整對 sortx 的影響JVM