广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 2565 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
t0306894 手机
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖
头衔:
版主
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[PHP][教学] PHP和网路安全组织(OWASP)十大安全漏洞
PHP和网路安全组织(OWASP)十大安全漏洞
网络安全组织--开放网络应用安全计划发布一个有用的档案,列举了他们认为的网络应用程式十大安全漏洞
这些漏洞能够,当然也包含在PHP应用程式中。这里是关于如何避免它们的一些提示。我将包含相关链接及参考出处。

1、未经认证的参数
最重要的是,关闭register_globals.在PHP4.2.0或者更新的版本中,这个配置设置预设的是关闭的。通过全域的阵列($_GET、$_POST和 $_COOKIE),从URL、表单和cookie(个人隐密资料)存储数值。
在你通过全域的阵列使用数值之前,验证他们以确认他们没有包含非预期的输入。如果你已经知道你需要何种类型的数值,还要确信它符合预期格式。例如,如果你期望一个美国邮政编码,就要确信你的数值是五位数或一个五位数字、连字符(-)和四位附加数字。一般,正规表达式最容易验证这样的数据。
如果你期待从cookie(个人隐密资料)或者隐藏表单接收数据,在发送到一个客户端之前,请通过发送这个数据的hash(大陆一般译为“哈希”或“散列”)值和一个加密字连同数据一起的方式,以确信它没有被篡改。将hash连同数据一起放在一个隐藏的表单(或者放在cookie里面)。当你接收到数据和hash时,重新hash数据并确定新的hash匹配旧的hash。
如果用户改变cookie里的帐号值,这两个hash就不匹配。这种方法的成功显然取决于保持保密数据的保密,所以把它放在一个任何人都不能读的文件里并周期性地改变它。(但是记住,如果你改变了它,分布在cookie里的老的hash也许不再有效。)

2、不健全的访问控制
使用PEAR模块代替你自己的访问控制策略。对于你来说,Auth是基于cookie的认证,而Auth_HTTP是基于浏览器的认证。

3、不健全的帐号和session(交谈期,大陆译为“会话”)管理
  为了安全,使用PHP内置的session管理函数,即标准session管理。不管怎样,注意你的服务器被如何配置去存储session信息。例如,如果session内容存储在/tmp目录下任何人都可读的文件中,这样任何登录该服务器的用户能够看到所有session的内容。请存储该session在一个数据库里面,或者文件系统里面只有指定的用户可以访问的地方。
  为了防止网络嗅探器探查出session序号,可以使用透过SSL来传送session。当你使用SSL连接时,你不需要做任何其他对PHP的特殊操作,但是你需要另外配置你的WEB服务器。

4、跨平台执行脚本的瑕疵(Cross-Site Scripting 简称XSS)
对于来自你的程式外部,过滤它们之前,不要显示任何信息,在隐藏表单区域、查询字串或普通页面输出中内包含变数之前,先过滤它们。
PHP提供了许多工具过滤不可信数据:
htmlspecialchars()   转换& > " < 到他们的等价的HTML代码,通过使用 ENT_QUOTES 作为第二个参数还能够转换单引号'。

strtr()过滤你想要过滤的任何字符。通过strtr()实现过滤和替换字符阵列。把( 和 )转换为他们等价的HTML代码,作为防止XSS攻击的办法
$safer = strtr($untrusted, array('(' => '(', ')' => ')'));

strip_tags()从一个字串中移除HTML和PHP标记。

utf8_decode()把一个字串中的 ISO-8859-1 字符集改成使用Unicode UTF-8方式编码为单字节ASCII字符。一些XSS攻击者尝试隐藏他们的攻击代码为Unicode编码。你能使用utf8_decode() 去除这些Unicode编码。

5、缓冲区溢出

You can't allocate memory at runtime in PHP and their are no pointers like in C so your PHP code, however sloppy it may be, won't have any buffer overflows.(这个地方可能翻译不对)

你不能在PHP的执行期间配置其记忆体,在PHP程式中,也没有像C语言一样的指标。然而可能会有些些弱点,将不会有任何的缓冲区溢出。
你需要密切注意什么?不管怎样,是PHP自身和它的扩展缓冲区溢出.订阅PHP-announce邮件列表以保证你的PHP为最新版本和打了最新补丁。

6、被植入命令的缺陷
  当你显示未过滤的、未被脱逸过的(逃逸,意为把特殊字符转换成HTML方式表示,如'表示为'(译者注))恶意的内容到用户的浏览器时,XSS(跨站脚本)缺陷就会产生。未过滤的、未被脱逸过的命令到一个外部进程或者数据库。要防止被植入命令的缺陷,除确认输入数据之外,同样要在传送它到一个扩展进程或数据库里之前脱逸用户的输入。
  如果你要传递用户输入到shell(操作系统里的命令解释程式--译者注)(经过一个像exec()、system()或者其反向操作),首先,问你自己是否真的需要它。PHP自身函数就可以完成大多数的文件操作。如果你绝对地、一定地需要运行一个名字和参数来源于可信的输入的外部程式,请使用escapeshellcmd()脱逸程式名,用escapeshellarg()脱逸参数。

  在执行一个外部程式或操作下个外部文件之前,你也必须使用realpath()规范它的路径名。它展开所有符号链接,翻译“.”为当前目录,“..”为上一层目录,以及移除重复的路径分隔符。一旦一个路径名被规范,你能够测试它以保证它满足确定的条件,比如要求在WEB服务器档案根目录或者用户的主目录中。
  如果你通过用户输入一个SQL查询,在放入查询中之前,用addslashes()脱逸其输入。用mysql_real_escape_string()脱逸字串, 如果是PHP4.3.0以前版本则使用mysql_escape_string()。
如果你使用PEAR DB 数据库抽象层,你能够使用DB::quote()方法或者使用像?这样的查询占位符号,自动地脱逸该值替代占位符号。

7、关于错误处理的问题
如果用户(或者攻击者)能够看到PHP返回的原始错误信息(包含你的数据库、或者外部程式),他们便能够推测你的系统结构以及你使用的软体。这些有根据的推测使攻击者更容易入侵你的系统。错误信息不能包含任何描述性的系统信息。使用下列配置指令,告诉PHP将错误信息在你服务器的错误日志里而不是将它们显示给用户:

log_errors = On
display_errors = Off

8. 不可信的用户和密码
mcrypt扩展提供了许多流行的加密算法。使用mcrypt代替你自己的加密方案。同样,注意你的加密密码存放地点。如果一个攻击者能够容易轻易地获得解密密码,那么世界上最健壮的算法也是没有意义的。如果不管怎样,你一定需要存储你的密码,让它们和解密数据分开存放。更好的办法是,如果一些东西被解密,不要存储密码和提示用户(当然,如果你提示一个网上用户一些敏感数据(比如加密密码),在SSL里面那个提示和用户的确认都能够省略)。

9、远程管理缺陷
如果可能的话,使用一个SSL连接以运行远程管理工具,以防止对密码和内容的监听。
如果你安装了有一个远程管理组件的第三方软件,修改缺省的用户名和密码。如果可能,最好改变管理URL。用这个管理工具进行管理,在另一个不同的WEB服务器上运行比在公共的WEB服务器运行将是一个更好的主意。

10 网站和应用服务器错误配置
在订阅的php-announce(PHP通告)邮件列表中,保持PHP修补和安全问题在最上面。自从让攻击者看到你的代码之后,停止使用自动PHP资源显示管理器(AddType application/x-httpd-php-source .phps)。关于分布在PHP中的两个示例php.ini文件(php.ini-dist和php.ini-recommended),
使用php.ini-recommended作为你的网站配置的样本。



介绍大家一个透过facebook来玩的网页游戏 : 海盗王
献花 x0 回到顶端 [楼 主] From:台湾中华电信 | Posted:2005-02-14 14:53 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.074961 second(s),query:15 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言