【问题标题】:How to use A HREF with $_POST?如何使用带有 $_POST 的 HREF?
【发布时间】:2010-11-26 08:02:37
【问题描述】:

我有一个 HTML 菜单,其中包含 <a href="input&db=<some database>" 之类的链接。有多个菜单项和多个数据库,所以我使用 GET 作为我的表单方法并在我的菜单项链接中使用它。

但是,这会显示在浏览器的地址栏中(如 /inout&db=mydatabase),并且可能会导致用户开始猜测数据库名称。

如何使用 $_POST 获得指向同一页面的链接列表,其中只有数据库不同?


编辑:哎呀,我的坏应该只说服务器端,所以没有 JS

【问题讨论】:

  • 没有 JS => 不会发生。唯一的可能是提交一个<form method="post">,因此JS 将<a> 元素绑定到表单 改为使用提交按钮(样式为链接)。
  • 您可以使用表单并通过 CSS 将提交按钮设置为链接。
  • @Gordon (+1) 你能详细说明一下吗?
  • 没有太多要详细说明的。您只需编写一个带有一些输入字段和一个常规提交按钮的常规表单。然后使用 CSS 使其看起来尽可能接近常规链接,例如将背景颜色设置为透明并删除边框等。

标签: php html post


【解决方案1】:

POST 值对于任何精通此信息的人来说都是显而易见的。除非您正在构建类似 phpMyAdmin 的东西,否则您一开始就不应该将此类内部信息传递给客户端。如果你是,伤害在哪里?您确实有适当的身份验证,不是吗?

【讨论】:

  • +1 但是 - 有多少是精明的?我所需要的只是足以阻止那些可能投票给 T 党的人
  • @Mawg 好吧,那你为什么要问? ;-) 这真的不是关于一个精明的人对您的网站感兴趣的机会有多大,您只需从头开始以安全的方式构建您的应用程序,始终是句号。我喜欢用“如果有可能出问题的机会,它最终会出错。”
  • @Mawg 虽然我理解这一点,但这是一个糟糕的借口(对于公司而言;如果需要更多时间,就可以获得更多的钱)。尝试采用像 CakePHP 或 CodeIgniter 这样的框架,这可以大大缩短您的开发时间,同时已经有了一个稳定的基础。
【解决方案2】:

我认为使用链接通过帖子发送请求的唯一方法是使用 JavaScript。但是通过邮寄方式发送根本不安全;任何人都可以安装 FireBug 来查看请求。

相反,我会建议对您的设计进行更改。数据库通常位于应用程序层次结构的底层,将页面细节与数据库结合起来听起来没有必要。也许您应该尝试封装页面,以便它们不需要知道从哪个数据库读取?

当然,我不知道您的应用程序的范围(您可能正在执行类似 phpmyadmin 的操作)。那么它可能是不可避免的,我只是建议通常的验证和神圣化所有用户的输入和他们的权利的组合。

或者您可以只加密您的数据库名称。我还是更喜欢改变设计。

【讨论】:

    【解决方案3】:

    使用锚点的onclick 事件提交隐藏的 POST 表单,或执行 AJAX POST 操作。

    【讨论】:

      【解决方案4】:

      没有。您可以应用一些狭窄而危险的解决方案:

      • 使用 iframe:一切都会像以前一样工作,但实际地址不会出现在浏览器地址栏中。
      • 使用 AJAX 获取数据。
      • 将链接替换为表单提交按钮或javascript: 链接。

      这些都解决了“数据库名称出现在地址栏中”的问题,但是:

      • 任何具有基本技术技能和适当工具(chrome、firebug)的人都可以通过查看发出的请求来确定数据库名称。
      • 不使用 GET 会弄乱浏览器的返回和刷新按钮,并阻止深度链接。

      我的建议是像现在一样继续使用 GET,但在 URL 中添加一个秘密令牌(例如HMAC(db_name,secret_key)),用户无法猜到,但服务器可以轻松检查其有效性。这样,除非您给用户一个指向数据库的链接(带有数据库名称和秘密令牌),否则世界上所有的猜测都不会让他们访问它。

      【讨论】:

        【解决方案5】:

        GET 或 POST 都不会隐藏您的数据库名称。
        即使您使用 POST,查看源代码也会显示 HTML。

        首先,您不应该公开您的数据库名称。

        或者用一些模糊映射替换它

        input&db=A
        input&db=B
        

        在内部,进行字符串匹配并将A 转换为实际的数据库名称

        【讨论】:

        • db=A|B|... 非常透明,IMO。 (半)默默无闻的安全性不应该是这里的解决方案。
        • +1 明白了……呃,明白了!!我忘了查看源,因为这里是星期五晚些时候。 KK,将其保留为 GET 并仅验证输入
        猜你喜欢
        • 2018-12-26
        • 2017-11-05
        • 2021-12-22
        • 2023-01-08
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 1970-01-01
        • 2013-06-04
        相关资源
        最近更新 更多