0


我正在开发一个使用 Symfony2 将书籍显示为交互式 Flash 内容的应用程序。每本书都有一个 index.html 文件,该文件包含所有嵌入在 html 代码中的 flash 内容和一些目录,其中包含书籍的所有必需部分(图像、js 文件等)与该 index.html 文件链接,并通过“src”相互链接和“href”标签等。我想在我的网站上显示这些书籍,同时防止匿名用户下载它们。
例如:
我的书在 web/Books 文件夹中,要显示 Book1 我必须显示 web/Books/Book1/index.html 文件。通过将这些文件放在 web 目录中,我允许匿名用户通过键入例如 www.example.com/Books/Book1/index.html 或类似的图像、js 文件等来访问它们(路径可以从书籍索引的内容中读取.html)。
有什么办法可以防止这种情况发生吗?
我是服务器的管理员,根目录设置在 web 目录中,如推荐的那样。
提前感谢您的任何回答。

编辑。[已解决]
好的,我找到了解决方案。这类似于 Pier-Luc 的 Gendreau 提案。
想法:
所有书籍都位于'books'文件夹中,每本书的index.html路径是/books/{title}/index.html。在.htaccess中我写了RedirectMatch,例如:/books/book1/index.html被重定向到/bookrouter/book1/index.html。像这样的路径不是现有文件的路径,因此 Symfony2 可以将其作为路由处理。路由模式是 /bookrouter/{path}.{_format}(需要 {path} 以允许“/”符号),因此我可以使用正确的标题和内容创建准确的响应,并通过所有必需的身份验证/授权提供所需的文件。这有两个不好的方面:
1. 我必须分别处理每个文件扩展名以创建正确的 http 标头和内容。
2. 更有经验的程序员说,如果我们的用户数量和我们预期的一样多,这种处理每个请求的方式会杀死我们的服务器,所以我们不能使用它。

所以人们,谢谢你的时间!我希望我的解决方案描述清楚,也许将来有人会发现它有用。干杯!

4

3 回答 3

0

您需要设置防火墙以拒绝匿名用户访问某些路由。

请参阅文档章节Security

为了快速开始考虑使用FOSUserBundle

于 2013-07-14T16:30:34.377 回答
0

要保护 css、js 和图像文件,您应该使用 Assetic,因为 Assetic 会为资产生成新的 URL。

例如,这里的新 URL 将是 /css/secure :

{% stylesheets '@AcmeFooBundle/Resources/public/css/secure-folder/*' output='css/secure/' filter='cssrewrite' %}

    <link rel="stylesheet" href="{{ asset_url }}" />

{% endstylesheets %}

然后您可以为匿名用户限制此路由。

# app/config/security.yml
security:
    # ...
    access_control:
        - { path: ^/css/secure, roles: ROLE_USER }
于 2013-07-14T15:43:30.800 回答
0

如果不对您当前的结构进行任何修改,我认为您正在寻找一个不存在的答案。这些书在 Symfony 之外,因此排除了所有适当的 Symfony 安全访问方式。您几乎被基本的 HTTP 身份验证所困扰.htaccess

但是,您可以将这些书带入 Symfony。

首先,将您的index.html书籍移动到存储视图的位置,将每本书重命名为它的 slug(Book1 的index.html变为Book1.html等)

其次,创建一个BookController其基本路由为的/Books和一个带有$slug参数的secureBookAction,以便书本路由为/Books/{slug}。看来您知道如何确保路线安全,所以我将由您决定。

第三,根据 slug 参数渲染视图。您可能希望保留书籍列表,以便您可以对与书籍不对应的 slug 做出正确反应。

最后,我会将您的资产留在现在的位置,只要确保您使用的是绝对路径,否则它们会中断。这样会更简单,如果没有随附的书,它们不太可能有用。

抱歉,如果我的回答是对代码的轻描淡写,尽管我认为我已经明确了策略,但我在几周内没有接触任何 Symfony。

于 2013-07-14T21:28:01.920 回答