【问题标题】:How to prevent server side from receiving data from unintended source如何防止服务器端接收来自非预期来源的数据
【发布时间】:2011-07-01 21:59:04
【问题描述】:

我有一个名为 addItem 的 PHP 服务。
当有人在客户端提交表单时调用此服务。

我怎样才能确保只有在从预期表单调用时才会添加项目?
例如,试图阻止某人通过自动 curl 调用提交内容。

谢谢你,
三通

【问题讨论】:

  • 用表单发送浏览器数据?可以伪造,但它是什么。

标签: php security


【解决方案1】:

简短的回答是你不能。只要表单是可访问的,您用来保护表单的任何方法都可以自动处理。您永远不应该指望用户发送的数据是安全的。但是,您可以做一些事情来让想要欺骗您的表单的人更具挑战性。

  • 添加CAPTCHA 可能会过滤掉几乎所有的脚本提交,但也会对普通用户产生最大的负面影响。
  • 采用某种形式的CSRF 保护(无论如何你都应该拥有)。这意味着任何想要通过表单提交数据的人都必须先请求表单。如果此表单只能在登录墙后面访问,这将非常具有挑战性。
  • 如果您已经要求您的用户使用 Javascript,请在​​设置密钥以保护 CSRF 时尝试使用 JS。这意味着必须解析或执行 JS 才能提交有效的表单。
  • 过滤常见的用户代理,例如 cURL 和 wget。
  • 检查表单是通过 POST 而不是 GET 发送的。
  • 在服务器上添加速率限制以将提交限制在合理的水平。
  • 检查 HTTP 引荐来源网址。很容易伪造,但要多跳一圈。

最终,如果有人想通过其他方式将数据提交到您的表单,这仍然是可能的。上述步骤可能会使其更具挑战性,但用户可以执行的任何操作始终可以编写脚本,因此请确保在服务器端进行适当的验证。

【讨论】:

【解决方案2】:

这篇文章有一个很好的答案:CSRF (Cross-site request forgery) attack example and prevention in PHP

基本思想是你想在表单中生成一些带有随机数的表单元素,并确保表单发回相同的元素。示例:

<form ...>
    <input name="csrf_dfjfi4i4i4k3" value="csrf_dfjfi4i4i4k3" type="hidden" />

现在,当您收到帖子时,请确保该元素存在并且值与名称相同。

【讨论】:

  • 故意的脚本提交不同于 CSRF 攻击。尽管我在回答中也提到了 CSRF 保护,但这确实对安全性没有太大影响。
  • OP 的问题对此有点含糊,我知道他想确保在提交之前阅读了表单,这完成了。可能你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
相关资源
最近更新 更多