使用PHP编写文件的安全含义

使用PHP编写文件的安全含义,php,security,caching,Php,Security,Caching,我目前正试图使用PHP创建一个CMS,纯粹是为了教育。我希望管理员能够创建内容,这些内容将被解析并以纯HTML的形式保存在服务器存储器中,以避免执行PHP脚本所带来的开销。不幸的是,我只能想到几种方法: 在CMS希望写入文件的每个目录上设置写入权限。这听起来是个很糟糕的主意 在单个缓存的目录上设置写入权限。PHP脚本可以在请求时包含或fopen/fread/echo缓存的目录中文件的内容。这也许可以用Mediawiki式的方式实现:像index.php?page=xyz这样的东西可以在运行时从

我目前正试图使用PHP创建一个CMS,纯粹是为了教育。我希望管理员能够创建内容,这些内容将被解析并以纯HTML的形式保存在服务器存储器中,以避免执行PHP脚本所带来的开销。不幸的是,我只能想到几种方法:

  • 在CMS希望写入文件的每个目录上设置写入权限。这听起来是个很糟糕的主意
  • 在单个
    缓存的
    目录上设置写入权限。PHP脚本可以在请求时
    包含
    fopen/fread/echo
    缓存的
    目录中文件的内容。这也许可以用Mediawiki式的方式实现:像
    index.php?page=xyz
    这样的东西可以在运行时从
    cached/xyz.html
    读取和回显内容。但是,我需要确保
    $\u GET['page']
    的健全性,以防止像
    index.php?page这样的恶劣变化=http://www.bad-site.org/malicious-script.js
我个人对第二个想法不太感兴趣,但第一个听起来很不安全。有人能提出一个好办法来完成这件事吗


编辑:我不赞成从数据库中获取数据。我希望从数据库中获取数据的唯一时间是缓存内容时。其次,我没有访问memcached或任何PHP加速器的权限。

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

因为您正在构建CMS,您必须接受这样一个事实:如果用户想对访问者做坏事,他们很可能会。无论您将内容存储在何处,这都是正确的

如果公共站点都是静态内容,那么让CMS直接编写文件没有什么错。但是,您需要将web服务器配置为不执行CMS可写入的任何目录中的任何内容


即使您不希望每次都访问数据库,也可以设置缓存以最小化数据库读取。在这方面效果很好,可以作为一个独立组件非常有效。

我选择第二个选项,但对其进行修改,以便使用mod_rewrite而不是自定义php函数检索文件。

如上所述,我正试图减少脚本的执行时间。我敢肯定,来回访问数据库会有点贵!我没有访问PHP加速器或memcached的权限。我想我也会把它编辑成问题+1用于提及执行权限。然而,我不同意你的第一点——你可以随意修改编辑器的功能(比如剥离javascript)。此外,您需要保护的不仅仅是访问者,还包括服务器的完整性。绝对!限制有意义的事情,但最终用户仍然可以制作一个网页,上面写着“我是Jon Foo,最近被废黜的尼日利亚国王的兄弟,我需要你的帮助将4200万美元转移到美国…”至于保护服务器,只要确保你只在允许写文件的地方写文件,不要让web服务器将其中的任何内容视为脚本。我并不想让这些听起来很琐碎——需要做很多细致的工作——但据我估计,这并不是天生的不安全。我认为,用户对访问者做坏事应该不会是一个问题,因为内容将由一个受信任的团队添加和缓存。我很好奇,恶意访问者是否会将公共目录上的写入权限用作潜在漏洞。感谢您指出执行部分!我目前无法真正设置缓存,因为预算是一个非常关键的问题,我们很可能会选择一个托管计划,为我们提供合理带宽的PHP/MySQL,而其他几乎没有。