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

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

时间:2017-11-02 15:13:48 [来源]:郑州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缓存控制器的详细介绍