阅读前提:你必须看过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);之前完成的。
/**
* 解决不受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);就可以把它关掉,然后可以用自己的方法来处理来自数据库或文件的数据。

Laravel使用其直观的闪存方法简化了处理临时会话数据。这非常适合在您的应用程序中显示简短的消息,警报或通知。 默认情况下,数据仅针对后续请求: $请求 -

PHP日志记录对于监视和调试Web应用程序以及捕获关键事件,错误和运行时行为至关重要。它为系统性能提供了宝贵的见解,有助于识别问题并支持更快的故障排除

PHP客户端URL(curl)扩展是开发人员的强大工具,可以与远程服务器和REST API无缝交互。通过利用Libcurl(备受尊敬的多协议文件传输库),PHP curl促进了有效的执行

Laravel 提供简洁的 HTTP 响应模拟语法,简化了 HTTP 交互测试。这种方法显着减少了代码冗余,同时使您的测试模拟更直观。 基本实现提供了多种响应类型快捷方式: use Illuminate\Support\Facades\Http; Http::fake([ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

您是否想为客户最紧迫的问题提供实时的即时解决方案? 实时聊天使您可以与客户进行实时对话,并立即解决他们的问题。它允许您为您的自定义提供更快的服务

文章讨论了PHP 5.3中引入的PHP中的晚期静态结合(LSB),从而允许静态方法的运行时分辨率调用以获得更灵活的继承。 LSB的实用应用和潜在的触摸


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载
最流行的的开源编辑器

记事本++7.3.1
好用且免费的代码编辑器

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),