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("Test", 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脚本:

  代码如下 复制代码

  /* 全局安全处理 */

  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

  代码如下 复制代码

  

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 表单如下所示:

  代码如下 复制代码

  Username:

  Password:

  叫做$allowed的数组用来检验哪个表单变量是允许的, 这个列表在表单被处理前应当是一致的。流程控制决定要执行什么,而process.inc是真正过滤后的数据到达的地方。

  注意

  确保security.inc总是被包含在每个脚本的最开始的位置比较好的方法是使用auto_prepend_file设置。

  过滤的例子

  建立白名单对于数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例子,部分例子可以帮助你对此有一个大体的了解。

  下面的代码对邮件地址进行了验证:

  代码如下 复制代码

  

$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:

  代码如下 复制代码

 

 $clean = array();

  switch ($_POST['color']) {

  case 'red':

  case 'green':

  case 'blue':

  $clean['color'] = $_POST['color'];

  break;

  }

  ?>

  

  下面的代码确保$_POST['num']是一个整数(integer):

  代码如下 复制代码

  

    $clean = array();

  if ($_POST['num'] == strval(intval($_POST['num']))) {

  $clean['num'] = $_POST['num'];

  }

  

  下面的代码确保$_POST['num']是一个浮点数(float):

  代码如下 复制代码

  

$clean = array();

  if ($_POST['num'] == strval(floatval($_POST['num'])))

  {

  $clean['num'] = $_POST['num'];

  }

  

  ?>

  名字转换

  之前每个例子都使用了数组$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好的习惯。 永远不要在对数据验证后还将其保存在$_POST或者$_GET中,作为开发人员对超级全局数组中保存的数据总是应当保持充分的怀疑。

  需要补充的是,使用$clean可以帮助思考还有什么没有被过滤,这更类似一个白名单的作用。可以提升安全的等级。

  如果仅仅将验证过的数据保存在$clean,在数据验证上仅存的风险是你所引用的数组元素不存在,而不是未过滤的危险数据。

  时机

  一旦 PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚本发送数据。因此,没有数据可以被输入到脚本中(甚至register_globals被开启的情况下)。这就是为什么初始化变量是非常好的习惯。

  防注入

  

代码如下 复制代码

  //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 );

  }

  //防注入函数

  function inject_check($sql_str) {

  return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );

  //进行过滤,防注入

  }

  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数据过滤函数与方法示例【转载】的更多相关文章

  1. Filter 数组过滤函数精解示例

    '************************************************************************* '**模 块 名:Filter 数组过滤函数精解示 ...

  2. Python | Python常用函数、方法示例总结(API)

    目录 前言 1. 运算相关 2. Sring与数字 3. 列表相关 4. 集合相关 5. 序列化类型 6. 字典相关 7. 输入输出 8. 文件相关 9. json模块 10. unittest测试模 ...

  3. 【summary】JQuery 相关css、ajax、数据操作函数或方法

    总结一下JQuery常用的函数方法,更加系统的整理一下. JQuery遍历的一些函数: 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集 ...

  4. python学习12-反射 判断函数与方法(转载)

    一.三个内置函数 1.issubclass(a, b)  判断a类是否是b类的子类 class Foo: pass class Zi(Foo): pass class Sun(Zi): passpri ...

  5. pandas 中处理数据的函数和方法

  6. Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数

    JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数                             ...

  7. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  8. PHP file_get_contents函数读取远程数据超时的解决方法

    PHP file_get_contents函数读取远程数据超时的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了PHP file_get_contents函数读取 ...

  9. PatentTips - 在物联网中进行数据过滤的方法和装置

    背景技术 [0001] 本发明涉及物联网,特别涉及在物联网进行数据过滤的方法和装置. [0002] 物联网是新一代信息技术的重要组成部分,特指物物相连的网络.具体地,物联网是指通过各种信息传感设备,如 ...

随机推荐

  1. 浅析jQuery框架与构造对象

    这是一些分析jQuery框架的文字    面向的读者应具备以下要求 1.非常熟悉HTML 2.非常熟悉javascript语法知识 3.熟悉javascript面向对象方面的知识 4.熟练使用jQue ...

  2. Educational Codeforces Round 4 B. HDD is Outdated Technology 暴力

    B. HDD is Outdated Technology 题目连接: http://www.codeforces.com/contest/612/problem/B Description HDD ...

  3. Java虚拟机的启动与程序的执行

    这篇文章是从 OpenJDK 源码的角度讲当我们执行了 java -classpath . hello 之后,java.exe 怎样从 main 函数開始运行,启动虚拟机,并运行字节码中的代码. 实验 ...

  4. TP复习6

    ## ThinkPHP 3.1.2 查询方式#讲师:赵桐正微博:http://weibo.com/zhaotongzheng 本节课大纲:一.普通查询方式 a.字符串 $arr=$m->wher ...

  5. KMP算法具体解释(转)

    作者:July. 出处:http://blog.csdn.net/v_JULY_v/. 引记 此前一天,一位MS的朋友邀我一起去与他讨论高速排序,红黑树,字典树,B树.后缀树,包含KMP算法,只有在解 ...

  6. 你真的会使用SQL Server的备份还原功能吗?之二:主要备份类型

    假设在下面几个时间段中,一个数据库积累插入了如下数据: 1.完整数据库备份 故名思意,完整数据库备份包括完整的数据库信息.它包括数据库的数据文件和备份结尾的部份活动事务日志. 完整备份基本语法如下: ...

  7. MOGODB REDIS

    http://www.cnblogs.com/huangxincheng/ http://blog.csdn.net/opens_tym/article/details/9832301 http:// ...

  8. hdu1050 Moving Tables

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1050 求区间上点的最大重叠次数. #include <stdio.h> #include &l ...

  9. 标准库 - fmt/print.go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  10. jquery冲突

    今天修改一个项目发现,前辈们自己写的一些方法和jquery冲突了,也就是$的冲突,以至于自己用jquery编写的新功能无法正常使用,细究后发现解决办法如下:使用 noConflict() 方法为 jQ ...