【问题标题】:Passing values through URL or POST variable instead?而是通过 URL 或 POST 变量传递值?
【发布时间】:2012-11-21 01:00:50
【问题描述】:

我正在实现一个消息系统(私人消息,如果你愿意的话),我希望能够通过文本链接显示用户拥有的消息列表,所以我不需要按钮来打开它. message_id(数据库中的唯一值)将通过 URL 传递。 (类似于 www.example.com/message/view/16)。假设我检查以确保用户 ID 的会话与发送消息的用户 ID 匹配,这样可以吗?为了让它更安全,我可以附加一个随机数并将其设置为会话,然后在查看时检查它。

我是否应该忘记这个想法并坚持使用提交按钮来查看消息?

【问题讨论】:

    标签: php session post


    【解决方案1】:

    POST 请求不会比 GET 请求提供更多安全性:任何半体面的 Web 调试工具都可以伪造 POST 请求。你永远不应该相信用户输入的数据。始终仔细检查授权以确保安全!

    也就是说,GET request semantics match what you're trying to do here

    HTTP 标准规定GET 请求应该是可重复的,没有任何重要的后果。例如,使用 GET 请求查看数据就足够了(并且可能做一些小事情,比如增加一个计数器,因为这些都是非常微不足道的后果)。其实GETHEAD是被认为是“安全”的两种请求方式。

    另一方面,POST 请求预计会产生重要的后果,例如发送消息或下订单。您不想意外执行两次的东西。如今,大多数浏览器也尊重这一点,在重新加载页面时警告用户会导致再次执行 POST 请求。

    【讨论】:

    • 我是否还应该在末尾附加一个随机字符串,设置会话,并在查看时匹配会话/字符串?
    • @user1104854,我建议使用 cookie 来存储会话 ID。随机字符串会阻止人们合法地保存 URL。您真正想要的是确保阅读消息的人确实是消息所属的人:您应该通过验证此人的身份与消息的收件人相同来做到这一点,并且您不应该基于其他浏览器传递的数据。 (另外请记住,甚至 cookie 都可以伪造。)
    • 听起来它会工作得很好。这不像我在存储银行帐户信息,所以 cookie 可以完成这项工作。谢谢!
    • @user1104854 我不会将随机字符串应用到 URL 的末尾,因为它可能会阻止用户为页面添加书签。您需要验证用户是否具有有效的登录名(可能通过$_SESSION 中的数据)。如果您在这里担心的是跨站点请求伪造(通常通过会话令牌匹配隐藏表单令牌来缓解),那么在这种情况下我不会担心您不会使用此更改服务器上的任何数据要求。这里的主要攻击媒介似乎是会话劫持,可以通过检查会话中的 IP 地址来缓解。
    • @user1104854 并在每个页面加载时使用 session_regenerate_id(true) 之类的东西来交换会话 ID。
    【解决方案2】:

    使用 GET 值查看消息是更好的主意,因为假设用户保持登录状态,这将允许他们为消息添加书签等。

    【讨论】:

      猜你喜欢
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多