【问题标题】:Symfony2 - how to display content and secure access to itSymfony2 - 如何显示内容并安全访问它
【发布时间】:2013-07-14 15:34:44
【问题描述】:


我正在开发一个使用 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. 更有经验的程序员说,如果我们的用户数量和我们预期的一样多,这种处理每个请求的方式会杀死我们的服务器,所以我们不能使用它。

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

【问题讨论】:

  • 您应该考虑使用数据库来存储您的数据。然后您只需要担心保护一页,您可以在您的图书对象上使用 ACL 以获得更细粒度的安全性。这是先前关于基本 Symfony2 安全性的答案:stackoverflow.com/questions/16656759/…
  • 此时我的双手被束缚了——这些书必须是 html、js、css、swf(可能还有其他)文件和图像的集合,并且运行它们的唯一方法是查看 index.html每本书的。它们存在于服务器上的 Symfony 目录旁边,符号链接位于 web 目录中。
  • 此时,如果您打算使用 symfony,您将需要重构您正在开发的任何遗留应用程序。最短的方法就是使用 apache 和基本身份验证,但它根本不涉及 Symfony。
  • 这是一个悲伤的消息。我将不得不向我的老板解释这一点。感谢您的宝贵时间。

标签: symfony symfony-2.3


【解决方案1】:

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

请参阅文档章节Security

为了快速入门,请考虑使用FOSUserBundle

【讨论】:

  • 我的解决方案不涉及 .htaccess ?! ...我在谈论 symfony2 提供的防火墙,您可以在文档中阅读它的工作原理。哦,你的评论不见了……
  • 对不起,我的评论消失了,第一次在 stackoverflow 上。我想说的是,在我的 web 目录中,我有带有规则的默认 .htaccess 文件: RewriteCond %{REQUEST_FILENAME} -f RewriteRule .? - [L] 重写规则 .? %{ENV:BASE}/app.php [L] 这意味着所有 url 都被定向到 app.php 并被视为 Symfony2 路由,但不是那些请求存在于 web 目录文件中的 url。因此,如果我为 /Books/Book1/{book} 设置路由,它将适用于 /Books/Book1/inde 但不适用于 /Books/Book1/index,因为该文件存在于 web 目录中。
【解决方案2】:

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

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

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

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

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

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

对不起,如果我的回答是对代码的了解,尽管我认为我已经明确了策略,但我在几周内没有接触任何 Symfony。

【讨论】:

  • 感谢您的回答,这很有趣,我会试试这个。我意识到我的理想解决方案可能不存在,但我不得不问。
【解决方案3】:

为了保护 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 }

【讨论】:

  • 这不起作用,因为 web 目录中现有文件的所有 url 都不是作为 Symfony2 的路由路径处理的,而是作为普通 url 处理的。这是因为 web 目录中的默认 .htaccess。我试过这个:(
  • 将您的文件添加到您的捆绑资源/公共文件夹中,它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多