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

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

阅读更多

作者:Thomas Myer 来源:IBM DeveloperWorks 2007-02-27 最后更新:2007-02-27 13:09:51
大家都知道安全性是重要的,但是行业中的趋势是直到最后一刻才添加安全性。既然不可能完全保护 Web 应用程序,那么为什么要费这个劲儿呢,不是吗?不对。只需采用一些简单的步骤就能够大大提高 PHP Web 应用程序的安全性。
开始之前
在本教程中,您将学习如何在自己的 PHP Web 应用程序中添加安全性。本教程假设您至少有一年编写 PHP Web 应用程序的经验,所以这里不涉及 PHP 语言的基本知识(约定或语法)。目标是使您了解应该如何保护自己构建的 Web 应用程序。
目标
本教程讲解如何防御最常见的安全威胁:SQL 注入、操纵 GET 和 POST 变量、缓冲区溢出攻击、跨站点脚本攻击、浏览器内的数据操纵和远程表单提交。





本教程是为至少有一年编程经验的 PHP 开发人员编写的。您应该了解 PHP 的语法和约定;这里不解释这些内容。有使用其他语言(比如 Ruby、Python 和 Perl)的经验的开发人员也能够从本教程中受益,因为这里讨论的许多规则也适用于其他语言和环境。





系统需求
需 要一个正在运行 PHP V4 或 V5 和 MySQL 的环境。可以使用 Linux®、OS X 或 Microsoft® Windows®。如果是在 Windows 上,那么下载 WAMPServer 二进制文件,在机器上安装 Apache、MySQL 和 PHP。

安全性快速简介
Web 应用程序最重要的部分是什么?根据回答问题的人不同,对这个问题的答案可能是五花八门。业务人员需要可靠性和可伸缩性。IT 支持团队需要健壮的可维护的代码。最终用户需要漂亮的用户界面和执行任务时的高性能。但是,如果回答 “安全性”,那么每个人都会同意这对 Web 应用程序很重要。
但是,大多数讨论到此就打住了。尽管安全性在项目的检查表中,但是往往到了项目交付之前才开始考虑解决安全性问题。采用这种方式的 Web 应用程序项目的数量多得惊人。开发人员工作几个月,只在最后才添加安全特性,从而让 Web 应用程序能够向公众开放。
结果往往是一片混乱,甚至需要返工,因为代码已经经过检验、单元测试并集成为更大的框架,之后才在其中添加安全特性。添加安全性之后,主要组件可能会停止工作。安全性的集成使得原本顺畅(但不安全)的过程增加额外负担或步骤。
本教程提供一种将安全性集成到 PHP Web 应用程序中的好方法。它讨论几个一般性安全主题,然后深入讨论主要的安全漏洞以及如何堵住它们。在学完本教程之后,您会对安全性有更好的理解。
主题包括:
•SQL 注入攻击
•操纵 GET 字符串
•缓冲区溢出攻击
•跨站点脚本攻击(XSS)
•浏览器内的数据操纵
•远程表单提交

Web 安全性 101
在讨论 实现安全性的细节之前,最好从比较高的角度讨论 Web 应用程序安全性。本节介绍安全哲学的一些基本信条,无论正在创建何种 Web 应用程序,都应该牢记这些信条。这些思想的一部分来自 Chris Shiflett(他关于 PHP 安全性的书是无价的宝库),一些来自 Simson Garfinkel(参见 参考资料),还有一些来自多年积累的知识。
规则 1:绝不要信任外部数据或输入
关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。
例如,下面的数据元素可以被认为是安全的,因为它们是在 PHP 中设置的。

清单 1. 安全无暇的代码

$myUsername = 'tmyer';
$arrayUsers = array('tmyer', 'tom', 'tommy');
define("GREETING", 'hello there' . $myUsername);

但是,下面的数据元素都是有瑕疵的。

清单 2. 不安全、有瑕疵的代码

$myUsername = $_POST['username']; //tainted!
$arrayUsers = array($myUsername, 'tom', 'tommy'); //tainted!
define("GREETING", 'hello there' . $myUsername); //tainted!

为什么第一个变量 $myUsername 是有瑕疵的?因为它直接来自表单 POST。 用户可以在这个输入域中输入任何字符串,包括用来清除文件或运行以前上传的文件的恶意命令。您可能会问,“难道不能使用只接受字母 A-Z 的客户端(JavaScript)表单检验脚本来避免这种危险吗?”是的,这总是一个有好处的步骤,但是正如在后面会看到的,任何人都可以将任何表单下载 到自己的机器上,修改它,然后重新提交他们需要的任何内容。
解决方案很简单:必须对 $_POST['username'] 运行清理代码。如果不这么做,那么在使用 $myUsername 的任何其他时候(比如在数组或常量中),就可能污染这些对象。
对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。在这个示例中,只希望接受字母。将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意。

清单 3. 使用户输入变得安全

$myUsername = cleanInput($_POST['username']); //clean!
$arrayUsers = array($myUsername, 'tom', 'tommy'); //clean!
define("GREETING", 'hello there' . $myUsername); //clean!

function cleanInput($input){
$clean = strtolower($input);
$clean = preg_replace("/[^a-z]/", "", $clean);
$clean = substr($clean,0,12);
return $clean;
}



规则 2:禁用那些使安全性难以实施的 PHP 设置
已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例如,要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST['variable']。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。
要 检查的第二个设置是错误报告级别。在开发期间,希望获得尽可能多的错误报告,但是在交付项目时,希望将错误记录到日志文件中,而不是显示在屏幕上。为什么 呢?因为恶意的黑客会使用错误报告信息(比如 SQL 错误)来猜测应用程序正在做什么。这种侦察可以帮助黑客突破应用程序。为了堵住这个漏洞,需要编辑 php.ini 文件,为 error_log 条目提供合适的目的地,并将 display_errors 设置为 Off。


规则 3:如果不能理解它,就不能保护它
一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它。
例如,您喜欢下面两段代码中的哪一段?

清单 4. 使代码容易得到保护

//obfuscated code
$input = (isset($_POST['username']) ? $_POST['username']:'');

//unobfuscated code
$input = '';

if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = '';
}

在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然后才能安全地处理。


规则 4:“纵深防御” 是新的法宝
本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要的措施。同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入。
纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦。
既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击。

分享到:
评论

相关推荐

    《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应用程序安全编程1

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

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

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

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

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

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

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

    SharePoint- Web应用程序操作手册

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

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

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

    自考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