【问题标题】:Using form post versus get for opening sub pages?使用表单发布与获取打开子页面?
【发布时间】:2013-10-09 11:50:17
【问题描述】:

使用表单发布将数据发送到其他页面而不是仅使用 html 链接 ($_GET) 方法是否是一种好习惯。

假设我的页面 users.php 列出了该站点的所有用户,那么我想页面 user_details.php 列出有关特定用户的详细信息 - 我可以有两种方法。

<a href="user_details.php?user_id=752">Details</a>

<form action="user_details.php" method="post">
<input type="hidden" name="user_id" value="742" />
<input type="button" name="nothing" value="User Details" />
</form>

或者我每次都可以加载代码,将 $_POST 数据放入 $_SESSION 然后在页面 user_details.php 上检查 $_SESSION 中的 >user_id 是不是更好的安全做法?

编辑:此站点需要进行身份验证才能看到任何内容。 管理员总共只有大约 10 页,所以我认为他们不需要添加书签。

【问题讨论】:

  • 表单中没有任何动作,你的“链接”是如何工作的?
  • 好吧,忘了那部分,不过这不是问题的重点
  • 这是重点的一部分,没有它,表格不起作用
  • $_GET$_POST$_SESSION的使用取决于功能,如果需要使用表单来编辑数据,使用$_POST,如果用户可以直接访问要阅读的页面使用 $_GET
  • 他如何直接访问这意味着他们需要知道用户 ID,如果我有多个管理员,那么他们只需更改 url 中的 ID 并编辑不属于他们的用户。

标签: php forms post get


【解决方案1】:

对于网络应用程序,对我来说,基本准则是:

  • 在不修改数据的情况下使用 GET(只读)
  • 在修改数据的情况下使用 POST(仅限 WRITE/UPDATE)
  • 在需要验证某些数据以返回可变结果类型的情况下使用 POST(即登录、联系表单等,根据发送的数据,返回页面的行为可能会有所不同)李>

对于典型的 Web 应用程序,还需要考虑您是否希望页面/资源可以通过数据配置进行导航。换句话说,您是否希望有人能够为该页面添加书签并查看相同的确切数据表示(数据读取)。如果是这样,请使用 GET。

这也很好地符合 REST 范例,通常支持以下 HTTP 操作:

  • GET -> 读取指定资源
  • POST -> 在数据资源上创建一个新的数据元素
  • PUT -> 更新资源上的现有数据元素
  • DELETE -> 删除资源上的现有数据元素

【讨论】:

  • 我想与此保持一致。我已经到处都有 $_POST,它只是我们聘请的其他设计师试图说它不是好的做法。
  • @PetjaZaichikov 您的其他设计师可能是正确的,具体取决于用例。实际上,对于您问题中提到的用例,我会说您应该在第一种方法中使用 GET 。请求者的身份验证以查看资源,应该是一个单独的问题。
  • 这个解释再好不过了
  • 我的网站是我喜欢的方式,正如我所说,如果我使用 GET,那么即使是入门级黑客/用户也可以在 url 中切换数字并查看他不应该看到的用户。跨度>
  • @PetjaZaichikov 那么你一开始就有一个非常糟糕的安全模型。您不认为黑客可以轻松修改隐藏的表单字段值吗?您的用户认证和访问限制应该分开处理。使用 GET 与 POST 绝对不能保护对目标页面的访问。
【解决方案2】:

为此使用 $_GET 的一个主要好处是它允许您的用户为 url 添加书签,本质上是链接到它,而不是强制用户填写表单。如果你使用 $_POST 这是不可能的。

但是,在 URL 方面,为此使用查询字符串并不是对用户最友好的。最好使用某种漂亮的 url 结构,如 Wordpress 或 Stackoverflow 对用户页面所做的。这可以通过编辑服务器上的 .htaccess 文件来完成。

【讨论】:

  • 我特别不希望任何人为事物添加书签,因为他们需要先进行身份验证才能使用站点,它是管理员站点的后端。
  • 所以,例如,如果我使用 GET 我可以刷新页面并保留数据,但不能使用 POST?对不起劫持...
  • 您可以刷新帖子,您只需在对话框出现时单击重新发送表单。不过目前不需要刷新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 2011-05-05
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多