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和ACCESS写聊天室(十)
Oct 09 PHP
使用adodb lite解决问题
Dec 31 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
php MessagePack介绍
Oct 06 PHP
php文件上传的简单实例
Oct 19 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
PHP实现的带超时功能get_headers函数
Feb 10 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
JavaScript实现将数组中所有元素连接成一个字符串的方法
2015/04/06 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
2015/12/14 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
基于vue的换肤功能的示例代码
2017/10/10 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
python算法学习之计数排序实例
2013/12/18 Python
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
Python实现计算最小编辑距离
2016/03/17 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
详解Python if-elif-else知识点
2018/06/11 Python
python里dict变成list实例方法
2019/06/26 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
python小白切忌乱用表达式
2020/05/29 Python
在校生钳工实习自我鉴定
2013/09/19 职场文书
动物科学专业毕业生的自我评价
2013/11/29 职场文书
人事专员职责
2014/02/22 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
不同意离婚代理词
2015/05/23 职场文书
仰望星空观后感
2015/06/10 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP