PHP防止注入攻击实例分析


Posted in PHP onNovember 03, 2014

本文以实例形式详细分析了PHP防止注入攻击的方法。分享给大家供大家参考。具体分析如下:

PHP addslashes() 函数--单撇号加斜线转义

PHP String 函数

定义和用法

addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
 单引号 (')
 双引号 (")
 反斜杠 (\)
 NULL
语法:

addslashes(string)

参数  描述
string 必需。规定要检查的字符串。

提示和注释

提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。
注释:默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

例子

在本例中,我们要向字符串中的预定义字符添加反斜杠:

<?php

$str = "Who's John Adams?";

echo $str . " This is not safe in a database query.<br />";

echo addslashes($str) . " This is safe in a database query.";

?>

输出:
Who's John Adams? This is not safe in a database query.
Who\'s John Adams? This is safe in a database query.

get_magic_quotes_gpc函数

function html($str)

{

     $str = get_magic_quotes_gpc()?$str:addslashes($str);

     return $str;

}

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 空字符会自动转为含有反斜线的溢出字符。
 
magic_quotes_gpc

对于 php.ini 中的 magic_quotes_gpc,是设置为 off 还是为 on 呢?

个人观点,应该设置为 on

总结如下:

1. 对于magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于magic_quotes_gpc=off 的情况

必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

补充:

magic_quotes_gpc 作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime 作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据
 
代码:

<?php  

/* 

有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)?那就自定义一个可以“横扫千军”的函数 

*/  

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程序设计有所帮助。

PHP 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
基于mysql的bbs设计(二)
Oct 09 PHP
也谈php网站在线人数统计
Apr 09 PHP
php生成随机密码的几种方法
Jan 17 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
Oct 13 PHP
php获取根域名方法汇总
Oct 28 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
PHP如何使用JWT做Api接口身份认证的实现
Feb 03 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
自编函数解决pathinfo()函数处理中文问题
Nov 03 #PHP
php基于base64解码图片与加密图片还原实例
Nov 03 #PHP
PHP处理Oracle的CLOB实例
Nov 03 #PHP
PHP之uniqid()函数用法
Nov 03 #PHP
PHP实现Soap通讯的方法
Nov 03 #PHP
ThinkPHP实现二级循环读取的方法
Nov 03 #PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
Nov 03 #PHP
You might like
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
如何用jquery控制表格奇偶行及活动行颜色
2014/04/20 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
Python中操作符重载用法分析
2016/04/29 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
python 日志增量抓取实现方法
2018/04/28 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Django 解决由save方法引发的错误
2020/05/21 Python
python中什么是面向对象
2020/06/11 Python
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
方法名是否可以与构造器的名字相同
2012/06/04 面试题
UDP协议功能
2013/01/06 面试题
服装设计专业毕业生推荐信
2013/11/09 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
Pygame如何使用精灵和碰撞检测
2021/11/17 Python
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技