`

用PHP函数解决SQL injection 反斜杠

阅读更多

什么是魔术引号

当打开时,所有的 '(单引号),"(双引号),\(反斜线)和 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()

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() 进行检测。

stripslashes

(PHP 4, PHP 5)

stripslashes — Un-quote string quoted with addslashes()

说明

string stripslashes ( string $str )

Un-quotes a quoted string.

Note: If magic_quotes_sybase is on, no backslashes are stripped off but two apostrophes are replaced by one instead. 
SQL injection问题在ASP上可是闹得沸沸扬扬?5比换褂胁簧俟?内外著名的PHP程序“遇难”。至于SQL injection的详情,网上的文章太多了,在此就不作介绍。
如 果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\),由于表单提交的内 容可能含有敏感字符,如单引号('),就导致了SQL injection的漏洞。在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠。
但是,上面的方法只 适用于magic_quotes_gpc=Off的情况。作为一个开发者,你不知道每个用户的magic_quotes_gpc是On还是Off,如果把 全部的数据都用上addslashes(),那不是“滥杀无辜”了?假如magic_quotes_gpc=On,并且又用了addslashes()函 数,那让我们来看看:

<?php
//如果从表单提交一个变量$_POST['message'],内容为 Tom's book
//这此加入连接MySQL数据库的代码,自己写吧
//在$_POST['message']的敏感字符前加上反斜杠
$_POST['message'] = addslashes($_POST['message']);

//由于magic_quotes_gpc=On,所以又一次在敏感字符前加反斜杠
$sql = "INSERT INTO msg_table VALUE('$_POST[message]');";

//发送请求,把内容保存到数据库内
$query = mysql_query($sql);

//如果你再从数据库内提取这个记录并输出,就会看到 Tom\'s book
?>

这样的话,在magic_quotes_gpc=On的环境里,所有输入的单引号(')都会变成(\')……
其 实我们可以用get_magic_quotes_gpc()函数轻易地解决这个问题。当magic_quotes_gpc=On时,该函数返回TRUE; 当magic_quotes_gpc=Off时,返回FALSE。至此,肯定已经有不少人意识到:问题已经解决。请看代码:

<?php
//如果magic_quotes_gpc=Off,那就为提单提交的$_POST['message']里的敏感字符加反斜杠
//magic_quotes_gpc=On的情况下,则不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}
?>

其实说到这里,问题已经解决。下面再说一个小技巧。
有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)?D蔷妥远ㄒ逡桓隹梢浴昂嵘ㄇЬ?”的函数:

<?php
function quotes($content)
{
//如果magic_quotes_gpc=Off,那么就开始处理
if (!get_magic_quotes_gpc()) {
//判断$content是否为数组
if (is_array($content)) {
//如果$content是数组,那么就处理它的每一个单无
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//如果$content不是数组,那么就仅处理一次
addslashes($content);
}
} else {
//如果magic_quotes_gpc=On,那么就不处理
}
//返回$content
return $content;
}
?>

分享到:
评论

相关推荐

    PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠

    该函数能够去除字符串中的反斜杠。当从POST请求中接收到JSON字符串时,例如`$_POST['json']`,可以使用`stripslashes()`来去除字符串中的转义字符。示例如下: ```php $str = stripslashes($_POST['json']); ``` ...

    Android relaceALL替换字符串中的反斜杠

    理解并正确使用`replaceAll`函数,以及处理反斜杠在正则表达式中的转义,对于Android开发者来说至关重要。通过这个简单的`ReplacAllDemo`项目,你可以深入学习和实践这些概念,进一步提升你的编程技能。在实际项目中...

    用PHP函数解决SQL injection

    SQL injection问题在ASP上可是闹得...在这种情况下,我们可以用addslashes()来解决问题,它会自动在敏感字符前添加反斜杠。 但是,上面的方法只适用于magic_quotes_gpc=Off的情况。作为一个开发者,你不知道每个用户的

    反斜杠转正斜杠 bat

    平时打代码,加载路径的时候,总是反斜杠,然而路径名需要正斜杠,所以自己写了一个简单的bat,方便转换 效果预览:https://blog.csdn.net/a2583211/article/details/95047176

    PHP中的代码安全和SQL Injection防范3

    配置文件中的`magic_quotes_gpc`设置为`off`时,提交的数据不会自动在特殊字符前加上反斜杠`\`进行转义,这可能导致安全问题。 为了应对这一挑战,我们可以创建一个名为`str_check()`的函数,用于过滤POST提交的...

    php关于反斜杠转义字符.docx

    在处理正则表达式时,如果遇到需要转义的特殊字符,如路径中的斜杠(/),而PHP默认不会为斜杠添加反斜杠,可以使用`str_replace()`函数手动替换。例如,使用`str_replace('/', '\\/', $string)`将字符串中的每个...

    反斜杠的应用.txt

    - **文件路径**:在 Windows 操作系统中,文件路径通常使用反斜杠 (`\`) 作为目录分隔符,而在 Unix/Linux 系统中,则使用正斜杠 (`/`)。 #### 正则表达式 - 在正则表达式中,反斜杠经常被用来转义特殊字符,使得...

    SQL Injection Pocket Reference.docx

    SQL注入(SQL Injection)是一种常见的网络安全问题,主要发生在Web应用程序中,攻击者通过在输入字段中插入恶意的SQL代码,以获取未经授权的数据访问或控制数据库。《SQL Injection Pocket Reference》文档详细介绍...

    php关于反斜杠转义字符.pdf

    关闭魔术引号可以避免因不必要的转义导致的数据处理问题,尤其是当你需要使用正则表达式(preg_系列函数)时,因为反斜杠在正则表达式中具有特殊含义,可能会干扰匹配。 例如,如果你有一个包含单引号的字符串,如`...

    详解json串反转义(消除反斜杠).docx

    实现 JSON 字符串的反转义通常有多种方法,包括但不限于使用内置函数、第三方库或自定义函数等。下面将详细介绍其中一种简便的方法——使用 Apache Commons Lang 库中的 `StringEscapeUtils.unescapeJavaScript()` ...

    PHP在引号前面添加反斜杠(PHP去除反斜杠)

    为了避免在使用stripslashes时错误地移除必要的反斜杠,可以在去除反斜杠之前使用get_magic_quotes_gpc函数来检测魔术引号是否被启用: ```php if (get_magic_quotes_gpc()) { $str = stripslashes($str); } `...

    处理php自动反斜杠的函数代码

    - 如果 `$value` 不是数组,则直接使用 `stripslashes()` 函数去除反斜杠。 3. **全局变量处理**:分别对 `$_POST`、`$_GET` 和 `$_COOKIE` 这三个超全局变量中的数据进行处理,确保所有的输入数据都已去除了不必要...

    【JavaScript源代码】php去掉json反斜杠的实例讲解.docx

    在PHP端,我们可以使用`stripslashes()`函数来移除这些额外的反斜杠。这个函数的作用是删除由`addslashes()`函数添加的反斜杠。例如: ```php $str = stripslashes($_POST['json']); ``` 这里的`$_POST['json']`是...

    php输出反斜杠的实例方法

    具体到PHP,如果我们想在echo或print函数中输出一个反斜杠,我们应写作"\\", 而想输出两个反斜杠,我们则需要写作"\\\\", 以此类推。这种成对出现的规则是为了解决转义序列可能造成的问题,因为反斜杠后面可以接一个...

    php 反斜杠处理函数addslashes()和stripslashes()实例详解

    添加反斜杠的目的主要是为了防止这些字符在SQL查询中产生未预期的效果,例如,如果用户输入包含单引号的字符串,不进行转义可能会导致SQL语法错误或者更严重的安全问题,如SQL注入攻击。下面是一个`addslashes()`的...

    解决python 执行sql语句时所传参数含有单引号的问题

    这里注意,转义字符是反斜杠(\),所以要写成`\\'`而不是`\'`,因为Python字符串中,单个反斜杠会被解释为转义字符,所以需要写成双反斜杠来表示一个实际的反斜杠。 此外,描述中还提到了Python动态生成SQL语句和...

    Nginx反斜杠自动解码问题解决方法

    这段代码首先使用`urlencode()`函数对关键词进行编码,然后用`str_replace()`函数将所有出现的"%2F"和"%2f"替换为"%252F"。这样,当Nginx解码后,%252F会保持原样,不会被转换为"/"。 虽然这种方法能够解决问题,但...

Global site tag (gtag.js) - Google Analytics