使用PHP写文件的安全隐患

5
我目前正在尝试使用PHP创建一个CMS,纯粹出于教育兴趣。我希望管理员能够创建内容,这些内容将被解析并以纯HTML形式保存在服务器存储上,以避免执行PHP脚本所产生的开销。不幸的是,我只想到了几种方法:
- 在CMS想要写入文件的每个目录上设置写入权限。这听起来像一个相当糟糕的主意。 - 在单个cached目录上设置写入权限。然后,PHP脚本可以在请求时从cached目录中的文件中包含或fopen/fread/echo内容。这可能可以以Mediawiki-esque的方式进行:类似于index.php?page=xyz的东西可以在运行时从cached/xyz.html读取和回显内容。但是,我需要确保$_GET['page']的健全性,以防止像index.php?page=http://www.bad-site.org/malicious-script.js这样的恶意变体。 - 我个人对第二个想法并不是太感兴趣,但第一个听起来非常不安全。请问有人能提出一个好的完成此任务的方法吗?
编辑:我不赞成从数据库中获取数据。我只有在缓存内容时才想从数据库中获取数据。其次,我没有访问memcached或任何PHP加速器的权限。
3个回答

2
由于您正在构建CMS,您必须接受如果用户想对访问者做坏事,他们很可能会成功。这是无论您在哪里存储内容都是正确的。
如果公共站点全部是静态内容,那么让CMS直接编写文件并没有问题。但是,您需要配置Web服务器以不执行任何可由CMS编写的可写目录中的内容。
尽管您不希望每次都访问数据库,但可以设置缓存来最小化数据库读取。Zend_Cache非常适合此操作,并且可以作为独立组件使用。

+1 提到执行权限是正确的。然而,我不同意你的第一个观点 - 你可以限制编辑器的功能,比如禁用 JavaScript。此外,你需要保护的不仅仅是访问者,还有服务器的完整性。 - CurtainDog
当然可以!限制那些有意义的事情,但归根结底,用户仍然可以创建一个网页,上面写着“我是尼日利亚被废黜国王的兄弟Jon Foo,我需要你的帮助将4200万美元转移到美国...” 为了保护服务器,只需确保您只在允许写文件的位置编写文件,并且不要让Web服务器将其中任何内容视为脚本。 我并不是说这些都很琐碎 - 需要进行大量的细致工作 - 但在我看来,它本质上并不是不安全的。 - timdev
用户对访问者进行恶意操作不应该是一个问题,因为内容将由一群可信赖的人添加和缓存。我很好奇公共目录上的写入权限是否可以被恶意访问者用作潜在漏洞。感谢您指出执行部分!目前我无法设置缓存,因为预算是非常关键的问题,我们很可能会选择提供PHP/MySQL和合理带宽的托管计划。 - susmits

1
你应该将页面放入数据库中,并使用参数化的SQL查询检索它们。

正如我之前提到的,我正在尝试缩短脚本的执行时间。我相信访问数据库并返回会有一定的开销!我没有访问PHP加速器或memcached的权限。我想我也会将这个编辑到问题中! - susmits

0

我会选择第二个选项,但是会进行修改,使用mod_rewrite来获取文件,而不是使用自定义的php函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接