如何防止服务器端从非预期的源接收数据

时间:2011-07-01 21:59:04

标签: php security

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

如何确保只在从预期表单中调用时才添加项目? 例如,试图阻止某人通过自动卷曲调用提交内容。

谢谢你,
三通

2 个答案:

答案 0 :(得分:4)

简短的回答是,你做不到。只要表单可访问,您可以使用自动方式处理用于保护表单的任何方法。您永远不应指望用户发送的数据是安全的。但是,对于想要欺骗你的表格的人来说,你可以采取一些措施来使事情变得更具挑战性。

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

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

答案 1 :(得分:2)

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

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

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

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