我刚刚使用 Zend_Cache_Backend_Static 设置了静态页面缓存,以在我的应用程序中提供缓存的 html 文件,效果很好。我唯一担心的是它使用 $_GET 参数缓存文件的方式。因为它会自动创建一个映射到提供的 URL 路由的文件夹结构,所以在可能故意将大量 $_GET 参数附加到现有页面的情况下,这是否存在潜在的安全风险?达到最大目录深度还是最大文件长度?
例如:目前我正在缓存我的页面,/public/cache/static/
因此使用标准路由器/module/controller/action/param1/val1/param2/val2
或标准查询字符串/module/controller/action?param1=val1¶m2=val2
将创建以下目录结构:
/public/cache/static/module/controller/action/param1/val1/param2/val2.html
/public/cache/static/module/controller/action?param1=val1¶m2=val2.html
允许人们以这种方式(尽管有限)访问创建目录结构让我有点担心。Zend_Cache_Backend_Static 和相应的 Zend_Cache_Frontend_Capture 都必须在 ini 文件中设置,而不是通过 Zend_Cache 工厂,并且似乎没有任何设置选项。
是否只是用限制 $_GET 变量数量的自定义路由替换默认路由器的情况?这可能吗,还是我需要准确指定每条路线所需的变量(不是世界末日,而是更多限制)
更新:
所以现有的处理静态缓存的重写规则如下:
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{DOCUMENT_ROOT}/cached/index.html -f
RewriteRule ^/*$ cached/index.html [L]
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{DOCUMENT_ROOT}/cached/%{REQUEST_URI}\.html -f
RewriteRule .* cached/%{REQUEST_URI}\.html [L]
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
如果请求命中静态缓存中的页面,它将发送该 html 页面。如果不是,它将命中 Zend Framework 并生成它。
我可以在开头添加以下内容:
RewriteCond %{QUERY_STRING} \S
RewriteRule [^\?]+ /$0? [R=301,L]
这将完全擦除我的查询字符串。这很好,因为我仍然可以使用 Zend 框架的 URL 路径方法传递 $_GET 变量(我也通过提供非常明确的路由来限制它)。但是是否可以在不重定向的情况下做到这一点?