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 相关文章推荐
开发大型PHP项目的方法
Oct 09 PHP
jq的get传参数在utf-8中乱码问题的解决php版
Jul 23 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
PHP防止注入攻击实例分析
Nov 03 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
thinkphp jquery实现图片上传和预览效果
Jul 22 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
Oct 12 PHP
使用composer 安装 laravel框架的方法图文详解
Aug 02 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
php传值和传引用的区别点总结
Nov 19 PHP
php解析非标准json、非规范json的方式实例
Dec 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
星际争霸任务指南——神族
2020/03/04 星际争霸
php URL编码解码函数代码
2009/03/10 PHP
php中计算时间差的几种方法
2009/12/31 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php中的静态变量的基本用法
2014/03/20 PHP
php中rename函数用法分析
2014/11/15 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php简单压缩css样式示例
2016/09/22 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
JS创建优美的页面滑动块效果 - Glider.js
2007/09/27 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
Javascript this 的一些学习总结
2012/08/31 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
Python类的多重继承问题深入分析
2014/11/09 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
判断网页编码的方法python版
2016/08/12 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
PyQt5 QListWidget选择多项并返回的实例
2019/06/17 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
农村婚礼证婚词
2014/01/10 职场文书
社会实践感言
2014/01/25 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
就业协议书怎么填
2014/04/11 职场文书
运动会口号大全
2014/06/07 职场文书