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数据库密码的找回的步骤
Jan 12 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
Nov 27 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
Mar 11 PHP
PDO预处理语句PDOStatement对象使用总结
Nov 20 PHP
php生成随机颜色方法汇总
Dec 03 PHP
php通过sort()函数给数组排序的方法
Mar 18 PHP
PHP5多态性与动态绑定介绍
Apr 03 PHP
PHP实现在线阅读PDF文件的方法
Jun 17 PHP
PHP发送短信代码分享
Aug 11 PHP
PHP实现上传多图即时显示与即时删除的方法
May 09 PHP
在PHP中输出JS语句以及乱码问题的解决方案
Feb 13 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 时间转换Unix时间戳代码
2010/01/22 PHP
jQuery select的操作实现代码
2009/05/06 Javascript
validator验证控件使用代码
2010/11/23 Javascript
JavaScript学习笔记(一) js基本语法
2011/10/25 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
JavaScript闭包详解
2015/02/02 Javascript
基于Flowplayer打造一款免费的WEB视频播放器附源码
2015/09/06 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
2016/02/16 Javascript
AngularJS 实现弹性盒子布局的方法
2016/08/30 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
详解JS模块导入导出
2017/12/20 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
JavaScript实现随机点名程序
2020/03/25 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
奥地利网上书店:Weltbild
2017/07/14 全球购物
校园摄影活动策划方案
2014/02/05 职场文书
党的群众路线教育实践活动心得体会900字
2014/03/07 职场文书
励志演讲稿大全
2014/08/21 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
成都人事代理协议书
2014/10/25 职场文书
2016幼儿园新学期寄语
2015/12/03 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Python语言内置数据类型
2022/02/24 Python
漫画「处刑少女的生存之道」第3卷封面公开
2022/03/21 日漫
python+opencv实现目标跟踪过程
2022/06/21 Python