1、php提交数据过滤的基本原则
1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择。
2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。
3)在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数。
4)对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换。比如尖括号"<"就将转化为 "<"这样无害的字符。
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
strip_tags($text,);
5)对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。
2、PHP简单的数据过滤
1)入库: trim($str),addslashes($str)
2)出库: stripslashes($str)
3)显示: htmlspecialchars(nl2br($str))
看下面的例子以便进一步讨论dispatch.php脚本:
如果这是唯一的可公开访问到的 PHP 脚本,则可以确信的一点是这个程序的设计可以确保在最开始的全局安全处理无法被绕过。同时也让开发者容易看到特定任务的控制流程。例如,不需要浏览整个代码就可以容易的知道:当$form_valid为true时,end.inc是唯一显示给用户的;由于它在process.inc被包含之前,并刚刚初始化为false,可以确定的是process.inc的内部逻辑会将设置它为true;否则表单将再次显示(可能会显示相关的错误信息)。
注意
如果你使用目录定向文件,如index.php(代替dispatch.php),你可以像这样使用 URL 地址:http://example.org/?task=print_form。
你还可以使用 ApacheForceType重定向或者mod_rewrite来调整 URL 地址:http://example.org/app/print-form。
包含方法
另外一种方式是使用单独一个模块,这个模块负责所有的安全处理。这个模块被包含在所有公开的 PHP 脚本的最前端(或者非常靠前的部分)。参考下面的脚本security.inc
在本例中,每个提交过来的表单都认为应当含有form这个唯一验证值,并且security.inc独立处理表单中0需要过滤的数据。实现这个要求的 HTML 表单如下所示:
叫做$allowed的数组用来检验哪个表单变量是允许的, 这个列表在表单被处理前应当是一致的。流程控制决定要执行什么,而process.inc是真正过滤后的数据到达的地方。
注意
确保security.inc总是被包含在每个脚本的最开始的位置比较好的方法是使用auto_prepend_file设置。
过滤的例子
建立白名单对于数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例子,部分例子可以帮助你对此有一个大体的了解。
下面的代码对邮件地址进行了验证:
下面的代码确保了$_POST['color']的内容是red,green,或者blue:
下面的代码确保$_POST['num']是一个整数(integer):
下面的代码确保$_POST['num']是一个浮点数(float):
名字转换
之前每个例子都使用了数组$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好的习惯。 永远不要在对数据验证后还将其保存在$_POST或者$_GET中,作为开发人员对超级全局数组中保存的数据总是应当保持充分的怀疑。
需要补充的是,使用$clean可以帮助思考还有什么没有被过滤,这更类似一个白名单的作用。可以提升安全的等级。
如果仅仅将验证过的数据保存在$clean,在数据验证上仅存的风险是你所引用的数组元素不存在,而不是未过滤的危险数据。
时机
一旦 PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚本发送数据。因此,没有数据可以被输入到脚本中(甚至register_globals被开启的情况下)。这就是为什么初始化变量是非常好的习惯。
防注入
1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就搞定了。其实在涉及到变量取值时,intval()函数对字符串的过滤也是个不错的选择。
2)在php.ini中开启magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引号变为斜杠。magic_quotes_runtime对于进出数据库的数据可以起到格式话的作用。其实,早在以前注入很疯狂时,这个参数就很流行了。
3)在使用系统函数时,必须使用escapeshellarg(),escapeshellcmd()参数去过滤,这样你也就可以放心的使用系统函数。
4)对于跨站,strip_tags(),htmlspecialchars()两个参数都不错,对于用户提交的的带有html和php的标记都将进行转换。比如尖括号"<"就将转化为 "<"这样无害的字符。
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
strip_tags($text,);
5)对于相关函数的过滤,就像先前的include(),unlink,fopen()等等,只要你把你所要执行操作的变量指定好或者对相关字符过滤严密,我想这样也就无懈可击了。
2、PHP简单的数据过滤
1)入库: trim($str),addslashes($str)
2)出库: stripslashes($str)
3)显示: htmlspecialchars(nl2br($str))
看下面的例子以便进一步讨论dispatch.php脚本:
<?php /* 全局安全处理 */ switch ($_GET['task']) { case 'print_form': include '/inc/presentation/form.inc'; break; case 'process_form': $form_valid = false; include '/inc/logic/process.inc'; if ($form_valid) { include '/inc/presentation/end.inc'; } else { include '/inc/presentation/form.inc'; } break; default: include '/inc/presentation/index.inc'; break; } ?>
如果这是唯一的可公开访问到的 PHP 脚本,则可以确信的一点是这个程序的设计可以确保在最开始的全局安全处理无法被绕过。同时也让开发者容易看到特定任务的控制流程。例如,不需要浏览整个代码就可以容易的知道:当$form_valid为true时,end.inc是唯一显示给用户的;由于它在process.inc被包含之前,并刚刚初始化为false,可以确定的是process.inc的内部逻辑会将设置它为true;否则表单将再次显示(可能会显示相关的错误信息)。
注意
如果你使用目录定向文件,如index.php(代替dispatch.php),你可以像这样使用 URL 地址:http://example.org/?task=print_form。
你还可以使用 ApacheForceType重定向或者mod_rewrite来调整 URL 地址:http://example.org/app/print-form。
包含方法
另外一种方式是使用单独一个模块,这个模块负责所有的安全处理。这个模块被包含在所有公开的 PHP 脚本的最前端(或者非常靠前的部分)。参考下面的脚本security.inc
<?php switch ($_POST['form']) { case 'login': $allowed = array(); $allowed[] = 'form'; $allowed[] = 'username'; $allowed[] = 'password'; $sent = array_keys($_POST); if ($allowed == $sent) { include '/inc/logic/process.inc'; } break; } ?>
在本例中,每个提交过来的表单都认为应当含有form这个唯一验证值,并且security.inc独立处理表单中0需要过滤的数据。实现这个要求的 HTML 表单如下所示:
<form action="/receive.php" method="POST"> <input type="hidden" name="form" value="login" /> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <input type="submit" /> </form>
叫做$allowed的数组用来检验哪个表单变量是允许的, 这个列表在表单被处理前应当是一致的。流程控制决定要执行什么,而process.inc是真正过滤后的数据到达的地方。
注意
确保security.inc总是被包含在每个脚本的最开始的位置比较好的方法是使用auto_prepend_file设置。
过滤的例子
建立白名单对于数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例子,部分例子可以帮助你对此有一个大体的了解。
下面的代码对邮件地址进行了验证:
<?php $clean = array(); $email_pattern = '/^[^@s<&>]+@([-a-z0-9]+.)+[a-z]{2,}$/i'; if (preg_match($email_pattern, $_POST['email'])) { $clean['email'] = $_POST['email']; } ?>
下面的代码确保了$_POST['color']的内容是red,green,或者blue:
<?php $clean = array(); switch ($_POST['color']) { case 'red': case 'green': case 'blue': $clean['color'] = $_POST['color']; break; } ?>
下面的代码确保$_POST['num']是一个整数(integer):
<?php $clean = array(); if ($_POST['num'] == strval(intval($_POST['num']))) { $clean['num'] = $_POST['num']; } ?>
下面的代码确保$_POST['num']是一个浮点数(float):
<?php $clean = array(); if ($_POST['num'] == strval(floatval($_POST['num']))) { $clean['num'] = $_POST['num']; } ?>
名字转换
之前每个例子都使用了数组$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好的习惯。 永远不要在对数据验证后还将其保存在$_POST或者$_GET中,作为开发人员对超级全局数组中保存的数据总是应当保持充分的怀疑。
需要补充的是,使用$clean可以帮助思考还有什么没有被过滤,这更类似一个白名单的作用。可以提升安全的等级。
如果仅仅将验证过的数据保存在$clean,在数据验证上仅存的风险是你所引用的数组元素不存在,而不是未过滤的危险数据。
时机
一旦 PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚本发送数据。因此,没有数据可以被输入到脚本中(甚至register_globals被开启的情况下)。这就是为什么初始化变量是非常好的习惯。
防注入
<?PHP //PHP整站防注入程序,需要在公共文件中require_once本文件 //判断magic_quotes_gpc状态 if (@get_magic_quotes_gpc ()) { $_GET = sec ( $_GET ); $_POST = sec ( $_POST ); $_COOKIE = sec ( $_COOKIE ); $_FILES = sec ( $_FILES ); } $_SERVER = sec ( $_SERVER ); function sec(&$array) { //如果是数组,遍历数组,递归调用 if (is_array ( $array )) { foreach ( $array as $k => $v ) { $array [$k] = sec ( $v ); } } else if (is_string ( $array )) { //使用addslashes函数来处理 $array = addslashes ( $array ); } else if (is_numeric ( $array )) { $array = intval ( $array ); } return $array; } //整型过滤函数 function num_check($id) { if (! $id) { die ( '参数不能为空!' ); } //是否为空的判断 else if (inject_check ( $id )) { die ( '非法参数' ); } //注入判断 else if (! is_numetic ( $id )) { die ( '非法参数' ); } //数字判断 $id = intval ( $id ); //整型化 return $id; } //字符过滤函数 function str_check($str) { if (inject_check ( $str )) { die ( '非法参数' ); } //注入判断 $str = htmlspecialchars ( $str ); //转换html return $str; } function search_check($str) { $str = str_replace ( "_", "_", $str ); //把"_"过滤掉 $str = str_replace ( "%", "%", $str ); //把"%"过滤掉 $str = htmlspecialchars ( $str ); //转换html return $str; } //表单过滤函数 function post_check($str, $min, $max) { if (isset ( $min ) && strlen ( $str ) < $min) { die ( '最少$min字节' ); } else if (isset ( $max ) && strlen ( $str ) > $max) { die ( '最多$max字节' ); } return stripslashes_array ( $str ); } // www.jbxue.com //防注入函数 function inject_check($sql_str) { return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str ); // www.111cn.net 进行过滤,防注入 } function stripslashes_array(&$array) { if (is_array ( $array )) { foreach ( $array as $k => $v ) { $array [$k] = stripslashes_array ( $v ); } } else if (is_string ( $array )) { $array = stripslashes ( $array ); } return $array; } ?>
发表评论
-
php发送post请求函数
2014-03-10 09:08 529一个php发送post请求的函数。 代码如下: < ... -
php function用法如何递归及return和echo区别
2014-03-10 09:07 638php function用法如何递归及return和echo区 ... -
PHP_Cooikes不同页面无法传递怎么办
2014-03-08 08:11 338PHP_Cooikes不同页面无法传递的解决方法。 刚开始设置 ... -
php统计文章排行的代码
2014-03-06 17:11 617php统计文章排行示例,代码可以用在dedemcs上按月、周 ... -
c#批量上传图片到服务器示例分享
2014-03-06 17:07 1181c#批量上传图片到服务 ... -
php 启动报错的解决办法
2014-01-18 07:31 537php 启动时报错的情况,如下: [root@abc lnmp ... -
PHP 图片文件上传代码
2014-01-11 08:23 554通过 PHP,可以把文件上传到服务器。里面加入一些图片的判断, ... -
PHP文件上传原理分析
2014-01-11 08:20 312PHP文件上传原理简单分析,学习php的朋友可以参考下,确实比 ... -
php ftp文件上传函数(基础版)
2014-01-11 08:19 455不会用于php ftp函数文件上传,但有在使用比较高级的WEB ... -
php上传文件增强函数
2014-01-11 08:17 456php文件上传的增强函数首先变得傻瓜简单化,但并不是该函数的简 ... -
PHP生成随机用户名和密码的代码
2014-01-06 23:19 493使用PHP生成随机数可以应用在许多地方,比如可以设计程序的随机 ... -
PHP常见数据类型的汇总分享
2014-01-06 23:17 497PHP中常见的数据类型,特此记录。 PHP编程中常用的数据 ... -
php加减乘除计算器简单实现代码
2014-01-06 23:15 1163加减乘除计算器用php实现的,不错的示例。 代码: < ... -
PHP变色验证码实例
2014-01-06 23:13 435PHP实现变色验证码。 代码: <?php /** ... -
统计目录文件大小的php函数
2013-03-12 10:33 1117早上刚到公司,头告诉我,抓紧写一个小函数,用来统计指定目录中文 ... -
php 文件上传 简单代码
2013-03-10 08:15 7411、程序文件 <?php //判断临时文件存放路径是否 ... -
php上传图片的原理分析
2013-03-10 08:08 931在php编程中,有关php上传图片的问题,随时会遇到。 ph ... -
php无法上传大文件的解决方法
2013-03-07 22:59 737开发一个文件上传共享网站,曾想使用下面的代码实现文件上传的功能 ... -
php替换网址中参数变量的代码
2013-03-05 03:59 1004发布:thatgirl 来源:net 阅读: 6 ... -
php中文字符串截取函数支持多种编码
2013-03-05 03:57 739发布:sunday01 来源:net 阅读: 1 ...
相关推荐
PHP 函数参考手册 PHP 基础知识点: * PHP 介绍:PHP 是一种服务器端脚本语言,主要用于 web 开发。 * PHP 安装:PHP 安装过程包括下载、解压、配置和测试等步骤。 * PHP 语法:PHP 语法包括变量、数据类型、...
函数参考 I. .NET 函数 II. Advanced PHP debugger III. Alternative PHP Cache IV. Apache 特有函数 V. Array 数组函数 VI. Aspell 函数(已废弃) VII. BC math 高精度数学函数 VIII. Bzip2 压缩函数 IX. ...
### PHP函数参考手册知识点概述 本手册为PHP开发者提供了一个全面、详尽的函数参考指南。作为一门广泛使用的服务器端脚本语言,PHP在Web开发领域占有重要地位。本手册覆盖了从数组处理到日期时间操作等多个方面的...
在PHP编程中,过滤器...- PHP数据结构与算法教程 - PHP程序设计算法总结 这些专题将帮助你深入理解PHP编程,并提升解决问题的能力。在编写PHP代码时,始终考虑数据验证和安全性,可以使你的程序更加稳定和可靠。
过滤器扩展使得数据过滤过程变得更加简单和高效。 为什么使用PHP Filter过滤器? 在Web应用程序中,数据通常来自各种不可信源,例如用户输入、cookies、服务器变量或外部API。这些数据可能包含错误或恶意内容,...
`filter_var()`用于过滤和验证变量,比如检查邮箱格式、URL等,确保数据的安全性和有效性。 9. **json_encode()和json_decode()**: JSON是现代Web服务中常见的数据交换格式,这两个函数用于在PHP对象和JSON字符...
《PHP中文函数使用手册》是一本详尽阐述PHP编程中常用函数用法的参考资料,它涵盖了从基础到高级的各种函数,旨在帮助开发者更好地理解和运用PHP语言。手册中特别提到了BC高精准度函数库、历法函数库以及ICAP函数库...
主要是介绍PHP中filter函数校验数据的方法详解,PHP过滤器包含两种类型:Validation用来验证验证项是否合法、Sanitization用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除,需要的朋友可以...
《PHP函数手册》是PHP开发者不可或缺的参考资料,它详尽地收录了PHP语言中的各种内置函数,涵盖了数据处理、字符串操作、数组操作、文件系统、网络编程、日期与时间、数学运算、错误处理等多个领域。这份手册的独特...
2. `filter_var`函数用于过滤和验证变量,确保输入数据的安全。 3. `魔术常量`如`__FILE__`、`__LINE__`等,帮助开发者获取当前文件名和行号,便于调试。 4. `异常处理`引入了面向对象的错误处理机制,通过`try-...
它允许我们创建DataFrame对象,进行数据过滤、缺失值处理、类型转换等操作,确保数据质量。 4. **数据分析**:数据分析部分可能涉及统计学方法,如描述性统计、关联性分析、回归分析等。pandas库提供了丰富的内置...
函数参考 .NET — .NET 函数 Apache — Apache 特有函数 APC — APC 可选 PHP 缓存 APD — APD 高级 PHP 调试器 Arrays — Array 数组函数 Aspell — Aspell 函数(已废弃) BBCode — BBCode Functions BC math — ...
实现过滤功能时,可以使用PHP的字符串函数,如`str_replace()`或`preg_replace()`。`str_replace()`函数能简单地替换字符串中的指定字符或子串,而`preg_replace()`则更加强大,支持正则表达式,可以处理更复杂的...
函数参考 I. .NET 函数 II. Advanced PHP debugger III. Alternative PHP Cache IV. Apache 特有函数 V. Array 数组函数 VI. Aspell 函数(已废弃) VII. BC math 高精度数学函数 VIII. Bzip2 压缩函数 IX. ...
这份《PHP中文参考手册》是PHP开发者的重要参考资料,提供了详尽的函数介绍、语法解析以及实例应用,旨在帮助开发者深入理解和高效运用PHP。 一、PHP基础语法 PHP语法简洁,易于上手。其脚本可以嵌入HTML中,通过`...
### PHP参考手册:数组函数详解 #### 概述 PHP是一种广泛使用的开源脚本语言,尤其适用于Web开发。PHP的强大之处在于它丰富的内置函数库,其中数组处理函数尤其强大且实用。本文档将深入探讨PHP中与数组操作相关的...
此PHP4中文参考手册是开发者的重要资源,提供了详尽的函数、类、接口和语法规范,帮助开发者深入理解和高效使用PHP4。 **PHP4基础** PHP4引入了面向对象编程的支持,尽管不如后来版本完善,但已经可以创建类和对象...
同时,表单验证和数据过滤也是这一模块的重要部分,以确保输入数据的准确性和安全性。 考勤管理涉及到时间处理和统计分析,PHP提供了丰富的日期和时间函数,如date()、strtotime()等,用于处理员工的打卡记录。通过...