PHP安全编程:表单与数据安全

简单可靠地区分两类数据
服务器君一共花费了295.417 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

在典型的PHP应用开发中,大多数的逻辑涉及数据处理任务,例如确认用户是否成功登录,在购物车中加入商品及处理信用卡交易。

数据可能有无数的来源,做为一个有安全意识的开发者,你需要简单可靠地区分两类数据

  • 已过滤数据
  • 被污染数据

所有你自己设定的数据可信数据,可以认为是已过滤数据。一个你自己设定的数据是任何的硬编码数据,例如下面的email地址数据:$email = 'gonn@nowamagic.net';

上面的Email地址gonn@nowamagic.net并不来自任何远程数据源。显而易见它是可信的。任何来自远程数据源的数据都是输入,而所有的输入数据都是被污染的,必须在要在使用前对其进行过滤。

被污染数据是指所有不能保证合法的数据,例如用户提交的表单,从邮件服务器接收的邮件,及其它web应用中发送过来的xml文档。在前一个例子中,$email是一个包含有已过滤数据的变量。数据是关键,而不是变量。变量只是数据的容器,它往往随着程序的执行而为被污染数据所覆盖:$email = $_POST['email'];

当然,这就是$email叫做变量的原因,如果你不希望数据进行变化,可以使用常量来代替:

define('EMAIL', 'gonn@nowamagic.net');

如果用上面的语句进行定义,EMAIL在整个脚本运行中是一个值为gonn@nowamagic.net的不变的常量,甚至在你把试图把它重新赋值时也不会改变(通常是不小心)。例如,下面的代码输出为gonn@nowamagic.net (试图重定义一个常量会引起一个级别为Notice的报错信息)。

<?php
 
  define('EMAIL', 'gonn@nowamagic.net');
  define('EMAIL', 'rasmus@example.org');
  echo EMAIL;
 
?>

正如前面所讨论过的,register_globals可使确定一个变量如$email的来源变得十分困难。所有来自外部数据源的数据在被证明合法前都应该被认为被污染的。

尽管一个用户能用多种方式发送数据,大多数应用还是依据表单的提交结果进行最重要的操作。另外一个攻击者只要通过操纵提交数据(你的应用进行操作的依据)即可危害,而表单向他们方便地开放了你的应用的设计方案及你需要使用的数据。这也是表单处理是所有Web应用安全问题中的首先要关心的问题的原因。

一个用户可以通过三种方式您的应用传输数据:

  • 通过URL(如GET数据方式)
  • 通过一个请求的内容(如POST数据方式)
  • 通过HTTP头部信息(如Cookie)

由于HTTP头部信息并不与表单处理直接相关,在本章中不作讨论。通常,对GET与POST数据的怀疑可以推及到所有输入,包括HTTP头部信息。

表单通过GET或POST请求方式传送数据。当你建立了一个HTML表单,你需要在form标签的method属性中指定请求方式:

<form action="http://example.org/register.php" method="GET">

在前例中,请求方式被指定为GET,浏览器将通过URL的请求串部分传输数据,例如,考虑下面的表单:

<form action="http://example.org/login.php" method="GET">
  <p>Username: <input type="text" name="username" /></p>
  <p>Password: <input type="password" name="password" /></p>
  <p><input type="submit" /></p>
</form>

如果我输入了用户名gonn和密码mypass,在表单提交后,我会到达URL为http://example.org/login.php?username=gonn&password=mypass的页面。该URL最简单的合法HTTP/1.1请求信息如下:

GET /login.php?username=gonn&password=mypass HTTP/1.1
Host: example.org

并不是必须要使用HTML表单来请求这个URL,实际上通过HTML表单的GET请求方式发送数据与用户直接点击链接并没有什么不同。记住如果你在GET方式提交的表单中的action中试图使用请求串,它会被表单中的数据所取代。而且,如果你指定了一个非法的请求方式,或者请求方式属性未写,浏览器则会默认以GET方式提交数据。

为说明POST请求方式,只对上例进行简单的更改,考虑把GET请求方式更改为POST的情况:

<form action="http://example.org/login.php" method="POST">
  <p>Username: <input type="text" name="username" /></p>
  <p>Password: <input type="password" name="password" /></p>
  <p><input type="submit" /></p>
</form>

如果我再次指定用户名gonn和密码mypass,在提交表单后,我会来到http://example.org/login.php页面。表单数据在请求的内部而不是一个URL的请求串。该方式最简单的合法HTTP/1.1请求信息如下:

POST /login.php HTTP/1.1
Host: example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

username=gonn&password=mypass

现在你已看到用户向你的应用提供数据的主要方式。在后面,我们将会讨论攻击者是如何利用你的表单和URL作为进入你的应用的缺口的。

延伸阅读

此文章所在专题列表如下:

  1. PHP安全编程:register_globals的安全性
  2. PHP安全编程:不要让不相关的人看到报错信息
  3. PHP安全编程:网站安全设计的一些原则
  4. PHP安全编程:可用性与数据跟踪
  5. PHP安全编程:过滤用户输入
  6. PHP安全编程:对输出要进行转义
  7. PHP安全编程:表单与数据安全
  8. PHP安全编程:从URL的语义进行攻击
  9. PHP安全编程:文件上传攻击的防御
  10. PHP安全编程:跨站脚本攻击的防御
  11. PHP安全编程:跨站请求伪造CSRF的防御
  12. PHP安全编程:关于表单欺骗提交
  13. PHP安全编程:HTTP请求欺骗
  14. PHP安全编程:不要暴露数据库访问权限
  15. PHP安全编程:防止SQL注入
  16. PHP安全编程:cookie暴露导致session被劫持
  17. PHP安全编程:session固定获取合法会话
  18. PHP安全编程:session劫持的防御
  19. PHP安全编程:防止源代码的暴露
  20. PHP安全编程:留心后门URL
  21. PHP安全编程:阻止文件名被操纵
  22. PHP安全编程:文件包含的代码注入攻击
  23. PHP安全编程:文件目录猜测漏洞
  24. PHP安全编程:打开远程文件的风险
  25. PHP安全编程:shell命令注入
  26. PHP安全编程:暴力破解攻击
  27. PHP安全编程:密码嗅探与重播攻击
  28. PHP安全编程:记住登录状态的安全做法
  29. PHP安全编程:共享主机的源码安全
  30. PHP安全编程:更优的会话数据安全
  31. PHP安全编程:会话数据注入
  32. PHP安全编程:主机文件目录浏览
  33. PHP安全编程:PHP的安全模式

本文地址:http://www.nowamagic.net/librarys/veda/detail/1991,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/1991

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《编程之美:微软技术面试心得》 《编程之美》小组 (作者)

《编程之美:微软技术面试心得》是一本让人着迷的书!阅读起来。有些题目的内容会引起强烈的共鸣,尤其是那些自己非常熟悉并且又深知解答的题目;也有一些题目让我异常惊诧,原来除了我所知道的解答思路之外,还有更好的解答以及更深层次的原因。还有一些题目是从来没想到过的。阅读过程是一次愉快的享受,也是脑细胞持续活跃的过程。

更多计算机宝库...