`
xfcode
  • 浏览: 22486 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

PHP数据过滤函数参考

    博客分类:
  • php
 
阅读更多
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
/* 全局安全处理 */
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函数参考手册

    PHP 函数参考手册 PHP 基础知识点: * PHP 介绍:PHP 是一种服务器端脚本语言,主要用于 web 开发。 * PHP 安装: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过滤器 filter_has_var() 函数用法实例分析

    在PHP编程中,过滤器...- PHP数据结构与算法教程 - PHP程序设计算法总结 这些专题将帮助你深入理解PHP编程,并提升解决问题的能力。在编写PHP代码时,始终考虑数据验证和安全性,可以使你的程序更加稳定和可靠。

    9个必须知道的实用PHP函数和功能

    `filter_var()`用于过滤和验证变量,比如检查邮箱格式、URL等,确保数据的安全性和有效性。 9. **json_encode()和json_decode()**: JSON是现代Web服务中常见的数据交换格式,这两个函数用于在PHP对象和JSON字符...

    PHP中文函数使用手册

    《PHP中文函数使用手册》是一本详尽阐述PHP编程中常用函数用法的参考资料,它涵盖了从基础到高级的各种函数,旨在帮助开发者更好地理解和运用PHP语言。手册中特别提到了BC高精准度函数库、历法函数库以及ICAP函数库...

    PHP数据的提交与过滤基本操作实例详解

    本文实例讲述了PHP数据的提交与过滤基本操作。分享给大家供大家参考,具体如下: 1、php提交数据过滤的基本原则 1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像我们的注入问题,一个addslashes()也就...

    PHP中filter函数校验数据的方法详解

    主要是介绍PHP中filter函数校验数据的方法详解,PHP过滤器包含两种类型:Validation用来验证验证项是否合法、Sanitization用来格式化被验证的项目,因此它可能会修改验证项的值,将不合法的字符删除,需要的朋友可以...

    PHP函数手册

    《PHP函数手册》是PHP开发者不可或缺的参考资料,它详尽地收录了PHP语言中的各种内置函数,涵盖了数据处理、字符串操作、数组操作、文件系统、网络编程、日期与时间、数学运算、错误处理等多个领域。这份手册的独特...

    PHP5中文函数手册+MySQL中文参考手册+CSS2.0中文手册含索引+javascript中文手册

    2. `filter_var`函数用于过滤和验证变量,确保输入数据的安全。 3. `魔术常量`如`__FILE__`、`__LINE__`等,帮助开发者获取当前文件名和行号,便于调试。 4. `异常处理`引入了面向对象的错误处理机制,通过`try-...

    Python获取lunwen信息,包含数据爬取、数据分析、数据可视化代码

    它允许我们创建DataFrame对象,进行数据过滤、缺失值处理、类型转换等操作,确保数据质量。 4. **数据分析**:数据分析部分可能涉及统计学方法,如描述性统计、关联性分析、回归分析等。pandas库提供了丰富的内置...

    PHP5中文参考手册

    函数参考 .NET — .NET 函数 Apache — Apache 特有函数 APC — APC 可选 PHP 缓存 APD — APD 高级 PHP 调试器 Arrays — Array 数组函数 Aspell — Aspell 函数(已废弃) BBCode — BBCode Functions BC math — ...

    最新版php7 chm版手册

    1. 过滤输入数据:使用filter_var()函数对用户输入进行验证和过滤。 2. 安全的密码处理:password_hash()和password_verify()函数提供了一种安全的密码存储和验证方式。 这份《PHP7 CHM版手册》全面涵盖了以上知识...

    php做的敏感词过滤,功能很强大喔!神马敏感词都得过滤掉

    实现过滤功能时,可以使用PHP的字符串函数,如`str_replace()`或`preg_replace()`。`str_replace()`函数能简单地替换字符串中的指定字符或子串,而`preg_replace()`则更加强大,支持正则表达式,可以处理更复杂的...

    php手册.chm,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开发者的重要参考资料,提供了详尽的函数介绍、语法解析以及实例应用,旨在帮助开发者深入理解和高效运用PHP。 一、PHP基础语法 PHP语法简洁,易于上手。其脚本可以嵌入HTML中,通过`...

    PHP4 中文参考手册(CHM)

    此PHP4中文参考手册是开发者的重要资源,提供了详尽的函数、类、接口和语法规范,帮助开发者深入理解和高效使用PHP4。 **PHP4基础** PHP4引入了面向对象编程的支持,尽管不如后来版本完善,但已经可以创建类和对象...

    PHP实例开发源码-人事管理系统 php版.zip

    同时,表单验证和数据过滤也是这一模块的重要部分,以确保输入数据的准确性和安全性。 考勤管理涉及到时间处理和统计分析,PHP提供了丰富的日期和时间函数,如date()、strtotime()等,用于处理员工的打卡记录。通过...

    php中文参考手册(很适合新手使用)

    9. **HTTP与表单处理**:PHP可以获取和处理HTTP请求,包括GET、POST数据,`$_GET`和`$_POST`全局数组分别存储GET和POST数据,`header`函数用于设置HTTP头,实现重定向。 10. **网络编程**:PHP可以发送HTTP请求,...

    PHP完全参考手册

    11. **安全最佳实践**:手册会强调PHP应用的安全性,如防止SQL注入、XSS攻击,以及如何使用过滤和验证函数确保输入数据的安全。 12. **性能优化**:包括缓存技术(如APC、Memcached、Redis),代码优化策略,以及...

    网站开发参考书大全(php,javascript,html,css,smarty,mysql)

    本资料集合涵盖了"网站开发参考书大全",包括PHP、JavaScript、HTML、CSS以及Smarty和MySQL等关键领域的知识。这些技术是构建现代动态网站的基础,下面将逐一详细介绍。 1. PHP:全称“Hypertext Preprocessor”,...

Global site tag (gtag.js) - Google Analytics