Symfony 2 静态资源授权(防火墙后的 .js 文件)

4

如何在防火墙后保护静态资产(JavaScript和CSS)?

我有一个管理部分,其中大量使用JavaScript。我不想将代码暴露给公众。

目前,我使用Assetic将所有JavaScript编译为文件,并存储在“/ web / admin / js / xyz.js”。

我是否忽略了一种简单的方法来实现此目的?


据我所知,无法将静态文件放置在安全性下。期待对此问题的答案! - Vitalii Zurian
你使用的是哪个Web服务器?你可以通过IP或Cookie来保护请求的安全性。 - Gavin Love
Apache。我不想走那条路(这不切实际),我想使用内置的Symfony防火墙。 - calumbrodie
另一个使用案例是我的当前案例。我有一个JavaScript SPA,利用多个API构建业务关键仪表板。我不希望除授权用户以外的任何人访问SPA。是的,管理员可以登录,窃取仪表板源代码并复制它,但是同样的管理员也可以窃取服务器端代码。如果某人是小偷,那么对其进行身份验证并不能阻止他们成为小偷。 - Luke
2个回答

5
你可以使用控制器来提供静态文件,并保障该控制器的安全性。例如:
``` 你可以使用控制器来提供静态文件,并保护该控制器的安全性。例如: ```
/** 
 * Serves static javascript file. 
 * We have configured /secure to be secured by some firewall
 *
 * @Route("/secure/xyz.js", name="static_xyz")
 */
public function staticXyzAction()
{   

    $headers = array(
        'Content-Type' => 'text/javascript',
    );  

    return new Response(file_get_contents($this->get('kernel')
        ->getRootDir().'../web/admin/js/xyz.js'), 200, $headers);
}   

这只是一个使用您提供的数据的示例。显然,在您的最终代码中,提供文件的目录不应直接由Web服务器访问。

这种方法的明显缺点是性能。与您的Web服务器相比,PHP用于提供静态文件的速度要慢得多,但根据您的负载情况,这可能不是问题。


请问您能否将字体加粗,标注出“正在提供的文件应该位于某个目录中,该目录不直接可被 Web 服务器访问”这句话吗? - Vitalii Zurian
后端负载较轻,所以我认为这应该可以正常工作。我想如果我想使用防火墙,那么我别无选择,只能加载完整的框架。谢谢。 - calumbrodie
@thecatontheflat 我不确定在 assetic 的限制范围内这是否实际可行(assetic 遵循 web 根目录中的目录)。我能否强制任何对 /adminassets 位置中的静态资源的请求都通过前端控制器,并确保任何安全资源始终编译到该文件夹中? - calumbrodie
我猜你是可以的,但需要在你的Web服务器配置中进行更改。我确信其中包含指令“如果文件不存在,则将请求发送到app.dev”。;) - Vitalii Zurian
你可以实现一个脚本,将Assetic文件转储,然后将它们移动到另一个位置。 - Carlos Granados

1
为什么要“隐藏”这些管理 js 文件?js 不应执行关键的身份验证或检查权限,而只是与您的 Sf2 Apis / Controllers 进行交流,如果被读取也不应该是关键问题。这是一个概念问题。
如果您担心 lambda 用户/黑客会看到这些 js 文件,您可以在 Assetic 中设置非常复杂的随机 js 输出。Symfony .htaccess 只允许用户访问静态文件,如果他们知道确切的 URL,他们无法列出存储构建资产的存储库,防火墙会捕获它。
最后一个安全措施,使用 Assetic 的 yui-minifier 来缩小和混淆您构建的 js 文件。

它们不包含任何关键的授权或检查权限。但这是我的专有应用程序代码 - 因此,我不想把它留在可以下载的地方。你的方法(实际上)可以工作,但这有点像安全性通过模糊性(即使它本身不是安全风险,而是业务风险)。混淆的代码可以被反向工程。谢谢你的评论 - 你为我的问题提供了一个实际的解决方案(如果这真的是一个问题的话)。 - calumbrodie
我也同意这有点过度设计,可能没什么用。1. 谁想要窃取 JavaScript 代码?特别是混淆的代码。如果它不是为了一个非常通用的目的而被设计成一个合适的库,我会发现自己写起来更容易,如果它是,你应该开源它 :-) 2. 那些想要窃取它的人无论如何都需要获取 URL,如果他们没有访问管理员部分的权限(Assetic 使文件名难以猜测)。3. 如果管理员将其发送给他们,他们仍然可以获得它。客户端语言是提供给客户端的。 - Julien
1
答案不应该针对文件是否应该受保护,因为无论出于何种原因,开发人员可能希望将文件隐藏起来,答案应该指向帮助解决这个问题。我认为根据所提出的问题,这些回答的帮助程度很低。 - Donovan

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