【问题标题】:Hide the url in a Grails application在 Grails 应用程序中隐藏 url
【发布时间】:2011-09-04 13:48:32
【问题描述】:

有没有办法使用 Grails 应用程序在地址栏中隐藏 url。现在,Web 应用程序的用户可以从地址栏中查看和更改请求参数值,并且他们可以在显示页面中看到记录 ID。

在 Javascript 或 Groovy(URL 映射)或 Grails (.gsp) 或 HTML 或 Tomcat(server.xml 或 conf.xml 或 web.xml 中的 webapps 应用程序中)是否有方法

ex(http://www.example.com/hide/show /) 我想避开这个 url 并且总是看到 (http://www.example.com) 或 (http://www.example. com/hide/show) 没有记录 id

有没有办法防止这种情况发生?

【问题讨论】:

    标签: javascript html tomcat grails groovy


    【解决方案1】:

    不,大多数浏览器不允许您隐藏地址字段,即使您使用window.open 打开一个新窗口也是如此。这是一项安全功能,因此一个站点不能轻易伪装成另一个站点。

    您的应用程序应该进行安全检查,以便一个用户无法访问只有其他用户才能看到的数据。无论如何,仅仅隐藏 URL 并不安全,您可以使用浏览器内置的工具或现成的插件轻松解决这个问题。

    【讨论】:

    • 我不喜欢隐藏所有的 url ex(example.com/hide/show/<record id>) 我想避开这个 url 并且总是看到 (example.com) 或 (example.com/hide/show) 没有记录 id
    • @danny-london:您可以使用框架集让用户看到站点 URL 而不是框架的 url,但这只会阻止 URL 在地址字段中显示,框架的 URL 仍然可以很容易地被发现和更改。
    • @danny-london:制作一个框架集页面作为起始页面,其中包含两个框架(这是最少的)并在框架集中使用rows="*,0" 隐藏第二个框架。在第一帧中,您只需输入真实起始页的 URL。
    • 请注意,这不是好的设计,任何稍微复杂的用户仍然可以使用诸如 firebug 之类的工具覆盖您试图隐藏的内容。这不应被视为防止人们访问您应用中的其他网址的安全方法。它还将破坏简单的书签和深度链接,从而使开发和测试更加容易。
    【解决方案2】:

    它是 grails 实现的restful URL 模式的一部分。

    隐藏 URL 的最佳选择是在您希望用户在其地址栏中看到的页面中使用 iframe

    【讨论】:

      【解决方案3】:

      不太清楚你的意思,但我会更改 UrlMappings.groovy 中的默认根 URL 映射,使其看起来有点像这样:

          static mappings = {
      
          "/$controller/$action?/$id?"{
              constraints {
                  // apply constraints here
              }
          }
          //Change it here!!!!
          "/"(controller: 'controllerName', action: 'actionName')
      

      “actionName”和“controllerName”是您希望它们成为的样子 - 在您的示例中是“隐藏”、“显示”?

      除了通过 post 而不是 get 传递所有参数,只需更改 &lt;g:form&gt; 方法。

      显然,您仍然需要在控制器中实施其他发布者所述的任何安全检查。

      谢谢,

      吉姆。

      【讨论】:

        【解决方案4】:

        您可能可以使用 Post/Redirect/Get 的变体来处理这个问题:

        http://en.wikipedia.org/wiki/Post/Redirect/Get

        在我们的 Grails 网站上,我们有很多搜索字段。当用户点击分页链接时,所有这些搜索字段最终都会出现在创建丑陋 URL 的 URL 中:用户将这些地址添加为书签的风险更高,这可能意味着未来的问题。

        我们通过将所有 POST 和带参数的 GET 保存到会话中来解决这个问题,重定向到不带参数的 GET 并将它们再次附加到控制器中。这不仅创建了漂亮的 URL:s,而且还创建了一个内存,因此如果用户返回到较早的菜单,则该菜单中的选定详细信息会重新显示。

        对于您在“show/42”中隐藏 id 的特定请求,您可以同样处理,或者可能将 Grails 配置为使用“show?id=42”,但我们没有这个要求,所以我没有t 进一步研究了该问题。祝你好运!

        忘了提一下:这不会增加安全性,因为链接仍然包含 ID,它只会清理地址栏。

        这里有一些应该可以工作的示例代码。如果调用了 show?id=42,它会在会话中保存 id=42,然后重定向到仅显示,并且在进一步处理之前将 id=42 添加到参数中。它做你想做的事,但正如评论的那样,它可能并不总是明智的做法。

        def show = {
          if (request.method == 'GET' && !request.queryString) {
            if (session[controllerName]) {
              params.putAll(session[controllerName])
              // Add the typical code for show here...
             }
          } else {
            session[controllerName] = extractParams(params)
            redirect(action: 'show')
            return
          }
        

        【讨论】:

        • 没有发生任何变化,我在地址栏中看到相同的地址“show/42”
        • 该版本应该适用于 show?id=42。您需要实现 extractParams 以仅提取要保存的参数,或者更改为仅参数。将其视为让您工作的示例,仅此而已。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2011-02-22
        • 2012-09-08
        相关资源
        最近更新 更多