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. Ubuntu下很给力的下载工具

    Windows下的下载工具--迅雷,之所下面载速度快,乃是它能搜索资源.为己所用,而不是只从原始地址这单一资源处下载. Ubuntu下也有类似的工具,那就是aira2. aira2是一个命令行下载工具 ...

  2. EasyUI基础入门之Pagination(分页)

    前言 对于一些企业级的应用来说(非站点),页面上最为基本的内容也就是表格和form了.对于类似于ERP这类系统来说数据记录比較大,前端表格展示的时候必需得实现分页功能了.恰巧EasyUI就提供了分页组 ...

  3. /bin/bash: line 0: fg: no job control一般解决方法

    測试版本号:CDH5.0,(Hadoop2.3) 在使用windows调用Hadoop yarn平台的时候,一般都会遇到例如以下的错误: 2014-05-28 17:32:19,761 WARN or ...

  4. sqlserver2008 复制,镜像,日志传输及故障转移集群区别

    一, 数据库复制 SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步, ...

  5. png图片那点事

    PNG图片格式现在包含三种类型: 1.PNG8       256色PNG的别名 2.PNG24     全色PNG的别名 3.PNG32     全色PNG的别名 基本上PNG32就是PNG24,但 ...

  6. 剑指 offer set 10 栈的压入、弹出序列

    总结 1. 通过按位对比来判断, 没有更优的方法了

  7. javascript complete, onload

    1.complete 属性可返回浏览器是否已完成对图像的加载 <html> <head> <script type="text/javascript" ...

  8. 锁大全与 GDB调试

    1.innodb_lock_monitor:打开锁信息的方式 mysql> create table innodb_lock_monitor(id int) engine=InnoDB; Que ...

  9. ubuntu14 部署zookeeper3.4.6启动失败

    解压缩zookeeper,启动时,报如下错误: zkServer.sh: 81: /home/xxx/zookeeper-3.4.6/bin/zkEnv.sh: Syntax error: " ...

  10. Booting ARM Linux

    来源:linux-2.6.30.4/Documentation/arm/Booting ARM Linux Booting ARM Linux            ================= ...