多数大学生出来选择的工作和专业无关
首页 > 专业知识

探讨PHP数据过滤的安全之道

时间:2018-12-24 20:20:23 [来源]:郑州PHP培训学校

   探讨PHP数据过滤的安全之道

  对于初学者来说,他们也许并不在意PHP编码中的安全考虑。其实这是一个非常重要的考虑因素。下面,就让我们一起来看看PHP数据过滤的安全性能、
  PHP数据过滤调度方法
  这种方法是用一个单一的PHP脚本调度(通过 URL)。其他任何操作在必要的时候使用include或require包含进来。这种方法一般需要每个 URL 都传递一个单独的GET变量用于调度。这个GET变量可以被认为是用来替代脚本名称的更加简化的设计。例如:
  http://example.org/dispatch.php?task=print_formdispatch.php是唯一的根文件(Document root)。它可以让开发者做两件非常重要的事情:
  在dispatch.php最开始实现一些全局的安全处理,并且确保这些处理不可以被绕过。容易确定在必要的地方进行数据过滤,特别是一些特殊目的的控制流操作中。看下面的例子以便进一步讨论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;否则表单将再次显示(可能会显示相关的错误信息)。
 
  PHP数据过滤要注意的问题
  另外一种方式是使用单独一个模块,这个模块负责所有的安全处理。这个模块被包含在所有公开的 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;
  }
  ?>
  在这个PHP数据过滤例中,每个提交过来的表单都认为应当含有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是真正过滤后的数据到达的地方。
  一旦 PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚本发送数据。因此,没有数据可以被输入到脚本中(甚至register_globals被开启的情况下)。这就是为什么初始化变量是非常好的习惯。
  详解PHP页面跳转函数的具体含义
  对于PHP程序员来说,熟练的掌握PHP语言的函数是一个基本的要求。下面我们将会为大家介绍有关PHP页面跳转函数的相关含义。
  PHP本身没有一个完全意义上的PHP页面跳转函数,也许Header函数算一个,但是,它只能用于页面的第一行。如果放在PHP页面的最后位置,除非前面的PHP没有输出任何字符,否则,会报错。
  下面提供三种PHP自动页面跳转的方法,其一就是使用Header函数,其二则是使用HTML固有标记,当然,这个方法不仅仅可以应用于PHP,同样可以应用于ASP,.Net,以及Jsp中,第三种方法是输出Javascript,利用Js代码,达到PHP页面自动跳转的目的,同样的,这种方法也同样适用于PHP以外的其他语言,只是相应语言代码不同而已。
  PHP页面跳转函数一、用HTTP头信息(Header函数)
  也就是用PHP的HEADER函数。PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如声明返回信息的类型("Context-type: xxxx/xxxx"),页面的属性("No cache", "Expire")等等。
  用HTTP头信息使PHP自动跳转到另外一个页面的方法如下:
  < ?PHP
  $url = czbin.PHP
  Header("HTTP/1.1 303 See Other");
  Header("Location: $url");
  exit;
  ?>
  注意一下,"Localtion:"后面有一个空格。
  PHP页面跳转函数二、利用HTML标记(META中的REFRESH属性)
  用HTML标记,就是用META的REFRESH标记,举例如下:
  < ?PHP $url = czbin.PHP;?>
  < HTML>
  < HEAD>
  < META HTTP-EQUIV="REFRESH"
  CONTENT="10; URL=< ? echo $url;?>>
  < /HEAD>
  < BODY>
  < /BODY>
  < /HTML>
  注:这里的CONTENT="10 的意思是说10秒以后跳转。
  PHP页面跳转函数三、用JAVASCRIPT脚本来实现
  举例如下:
  < ?PHP
  $url=czbin.PHP;
  echo "< !--< SCRIPT LANGUAGE="JavaScript">";
  echo "location.href='$url'";
  echo "< /SCRIPT>-->";
  ?>

上一篇:详解PHP实现MVC的几种方法

下一篇:PHP表单重复提交的预防法则