`
isiqi
  • 浏览: 16484529 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

确保PHP应用程序的安全[4]

阅读更多

作者:Thomas Myer 来源:IBM DeveloperWorks 2007-02-27 最后更新:2007-02-27 13:11:25
浏览器内的数据操纵
有一类浏览器插件允许用户篡改页面上的头部元素和表单元素。使用 Tamper Data(一个 Mozilla 插件),可以很容易地操纵包含许多隐藏文本字段的简单表单,从而向 PHP 和 MySQL 发送指令。
用户在点击表单上的 Submit 之前,他可以启动 Tamper Data。在提交表单时,他会看到表单数据字段的列表。Tamper Data 允许用户篡改这些数据,然后浏览器完成表单提交。
让我们回到前面建立的示例。已经检查了字符串长度、清除了 HTML 标记并删除了十六进制字符。但是,添加了一些隐藏的文本字段,如下所示:

清单 17. 隐藏变量

<?php
if ($_POST['submit'] == "go"){
//strip_tags
$name = strip_tags($_POST['name']);
$name = substr($name,0,40);
//clean out any potential hexadecimal characters
$name = cleanHex($name);
//continue processing....
}

function cleanHex($input){
$clean = \
preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);
return $clean;
}
?>

<form action=\
"<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<p><label for=\"name">Name</label>
<input type=\
"text" name="name" id="name" size="20" maxlength="40"/></p>
<input type="hidden" name="table" value="users"/>
<input type="hidden" name="action" value="create"/>
<input type="hidden" name="status" value="live"/>
<p><input type="submit" name="submit" value="go"/></p>
</form>

注意,隐藏变量之一暴露了表名:users。还会看到一个值为 create 的 action 字段。只要有基本的 SQL 经验,就能够看出这些命令可能控制着中间件中的一个 SQL 引擎。想搞大破坏的人只需改变表名或提供另一个选项,比如 delete。
图 1 说明了 Tamper Data 能够提供的破坏范围。注意,Tamper Data 不但允许用户访问表单数据元素,还允许访问 HTTP 头和 cookie。


图 1. Tamper Data 窗口
Tamper Data 窗口

图 1. Tamper Data 窗口

要防御这种工具,最简单的方法是假设任何用户都可能使用 Tamper Data(或类似的工具)。只提供系统处理表单所需的最少量的信息,并把表单提交给一些专用的逻辑。例如,注册表单应该只提交给注册逻辑。
如果已经建立了一个通用表单处理函数,有许多页面都使用这个通用逻辑,那该怎么办?如果使用隐藏变量来控制流向,那该怎么办?例如,可能在隐藏表单变量中指定写哪个数据库表或使用哪个文件存储库。有 4 种选择:
•不改变任何东西,暗自祈祷系统上没有任何恶意用户。
•重写功能,使用更安全的专用表单处理函数,避免使用隐藏表单变量。
•使用 md5() 或其他加密机制对隐藏表单变量中的表名或其他敏感信息进行加密。在 PHP 端不要忘记对它们进行解密。
•通过使用缩写或昵称让值的含义模糊,在 PHP 表单处理函数中再对这些值进行转换。例如,如果要引用 users 表,可以用 u 或任意字符串(比如 u8y90x0jkL)来引用它。
后两个选项并不完美,但是与让用户轻松地猜出中间件逻辑或数据模型相比,它们要好得多了。
现在还剩下什么问题呢?远程表单提交。
远程表单提交
Web 的好处是可以分享信息和服务。坏处也是可以分享信息和服务,因为有些人做事毫无顾忌。
以表单为例。任何人都能够访问一个 Web 站点,并使用浏览器上的 File > Save As 建立表单的本地副本。然后,他可以修改 action 参数来指向一个完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因为表单在这个站点上),做他希望的任何修改,点击 Submit,服务器会把这个表单数据作为合法通信流接收。
首先可能考虑检查 $_SERVER['HTTP_REFERER'],从而判断请求是否来自自己的服务器,这种方法可以挡住大多数恶意用户,但是挡不住最高明的黑客。这些人足够聪明,能够篡改头部中的引用者信息,使表单的远程副本看起来像是从您的服务器提交的。
处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。
要创建随机的令牌,可以使用 PHP 内置的 md5()、uniqid() 和 rand() 函数,如下所示:

清单 18. 防御远程表单提交

<?php
session_start();

if ($_POST['submit'] == "go"){
//check token
if ($_POST['token'] == $_SESSION['token']){
//strip_tags
$name = strip_tags($_POST['name']);
$name = substr($name,0,40);
//clean out any potential hexadecimal characters
$name = cleanHex($name);
//continue processing....
}else{
//stop all processing! remote form posting attempt!
}
}

$token = md5(uniqid(rand(), true));
$_SESSION['token']= $token;


function cleanHex($input){
$clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);
return $clean;
}
?>


<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<p><label for="name">Name</label>
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>
<input type="hidden" name="token" value="<?php echo $token;?>"/>
<p><input type="submit" name="submit" value="go"/></p>
</form>

这种技术是有效的,这是因为在 PHP 中会话数据无法在服务器之间迁移。即使有人获得了您的 PHP 源代码,将它转移到自己的服务器上,并向您的服务器提交信息,您的服务器接收的也只是空的或畸形的会话令牌和原来提供的表单令牌。它们不匹配,远程表单提交就失败了。

分享到:
评论

相关推荐

    《PHP应用程序安全编程》(Tricia Ballad).[PDF]

    《PHP应用程序安全编程》是Tricia Ballad撰写的一本专著,主要针对PHP开发者,旨在帮助他们理解和实施安全的编程实践。PHP作为一种广泛使用的开源脚本语言,常用于Web开发,但同时也因为其灵活性和易用性,可能导致...

    PHP应用程序安全编程.rar

    在PHP应用程序开发中,安全是至关重要的一个环节。由于PHP是一种广泛使用的服务器端脚本语言,许多网站和应用程序都是基于PHP构建的。然而,如果不注意安全编程实践,PHP应用可能会遭受各种攻击,如SQL注入、跨站...

    PHP应用程序安全编程.rar.rar

    本文将深入探讨在PHP应用程序安全编程中所涉及的关键知识点,旨在帮助开发者避免常见安全漏洞,构建更健壮、更安全的系统。 1. **输入验证**:在处理用户输入时,必须对数据进行严格的验证和过滤。这包括URL参数、...

    如何应用PHP开发安全的应用程序

    PHP的设计目标是比Perl或C语言编写的CGI程序更安全,但正确配置编译选项和运行时设置以及采用安全编码实践是确保PHP应用程序安全的关键。 在使用PHP开发安全应用的过程中,有几个重要的注意事项: 1. **保持操作...

    php应用程序安全编程_第一章.pdf

    ### PHP应用程序安全编程知识点 #### 一、引言与安全观念 - **目的与受众**:本书面向PHP初学者及具有一定经验的开发者,旨在提升PHP应用程序的安全性。 - **安全误区**:书中强调不应将混淆文件名或目录结构视为...

    高级PHP应用程序漏洞审核技术

    然而,随着Web安全成为关注焦点,PHP应用程序的安全性问题也日益凸显。许多企业和组织纷纷成立专门的安全团队或聘请安全专家来进行代码审计,以确保其应用程序的安全性。传统的漏洞审计技术已经难以发现新型的安全...

    PHP应用程序安全编程1

    在PHP应用程序安全编程中,确保代码的安全性是至关重要的。PHP是一种广泛使用的开源脚本语言,常用于构建动态网站和Web应用程序。然而,由于其灵活性和动态性,如果不注意安全编程,很容易导致各种安全漏洞,如SQL...

    如何应用PHP开发安全的应用程序.pdf

    确保PHP应用程序的安全性需要从多个层面入手。首先,操作系统应当保持最新状态并安装所有必要的安全补丁。在编译PHP之前,要特别注意以下几点: 1. 整合Apache、PHP和MySQL:通常推荐使用Apache Toolbox来简化这一...

    高级php应用程序漏洞审核技术教程pdf版

    在深入探讨高级PHP应用程序漏洞审核技术...总结,高级PHP应用程序漏洞审核技术不仅涉及代码层面的安全,还涵盖了整体架构、依赖管理和安全意识。通过深入理解这些概念,开发者可以构建更安全、更可靠的PHP应用程序。

    用PHP构建Android手机应用程序.pdf

    ### 用PHP构建Android手机应用程序 #### 摘要与关键词解析 本文主要探讨了如何利用PHP语言在Android平台上开发应用程序。通常情况下,Android应用程序主要采用Java或Kotlin进行开发,但通过Android脚本层(SL4A)...

    SharePoint- Web应用程序操作手册

    如果多个Web应用程序共用一个应用程序池,则可能存在安全风险,因为一个应用程序的崩溃可能会导致整个应用程序池中的W3wp进程退出,从而影响到其他Web应用程序。因此,如果内存资源允许,通常建议为每个Web应用程序...

    自考07026网络应用程序设计真题三套,需要的可以下载

    9. **响应式设计**:随着移动设备的普及,响应式设计成为必备技能,确保应用程序在不同设备和屏幕尺寸上都能正常显示。 10. **持续集成/持续部署(CI/CD)**:理解自动化构建和部署流程,如使用Git进行版本控制,...

    php安全设置(涉及到本身程序的安全问题)

    在PHP的环境中,确保应用程序的安全性至关重要。PHP的旧版本存在一些已知的安全问题,因此推荐使用最新稳定版以减少漏洞的暴露。其中,SQL Injection是PHP应用中常见的安全威胁,它允许攻击者通过注入恶意SQL语句来...

    实现往linux上应用程序迁移的报告

    应用程序可能会对Linux系统性能和安全性产生影响,反之亦然。如果影响过大,可能需要重新审视迁移的必要性和方案的正确性。此外,移植过程需考虑操作系统特性对应用程序代码的影响,有时候可能需要通过虚拟化技术来...

    揭露PHP 应用程序中出现的五个常见数据库问题

    揭露 PHP 应用程序中出现的五个常见数据库问题 在 PHP 应用程序中,数据库问题是非常常见的。这篇文章将揭露五个常见的数据库问题,包括数据库模式设计、数据库访问和基于数据库的业务逻辑代码,并提供相应的解决...

    web应用程序结构化的过程

    测试阶段确保应用程序的性能、稳定性和安全性。这包括单元测试、集成测试、系统测试和用户体验测试。此外,还需进行兼容性测试,确保应用在不同浏览器和设备上的表现。 5. **发行**: 在测试成功后,准备发布应用...

Global site tag (gtag.js) - Google Analytics