在php中验证XMLHttpRequest

5
我正在使用以下代码将数据发送到 PHP 网站:
```php ```
(请注意,此处的代码已省略)
if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
              xmlhttp= new XMLHttpRequest();
      }
      else
      {// code for IE6, IE5
          xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlhttp.open("GET","addEmail.php?email="+escape(email),true);
      xmlhttp.send();
      xmlhttp.close;

有没有办法确保addEmail.php只能通过XMLHttpRequest运行,这样人们就不能简单地去www.domain.com/addEmail.php?email=some@thing.com让php站点接受他们的电子邮件并在页面上运行一千次请求呢?谢谢。

https://dev59.com/TXI-5IYBdhLWcg3wPFx2 - Eric Pigeon
3个回答

21

用户总是能够直接访问PHP脚本,但您可以通过将此检查添加到PHP脚本来更好地保护它:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')
{
  //CODE HERE
}

此外,就像Eugen Rieck提到的那样,您可以发送一个令牌。


谢谢!那可能就是我要找的东西了。顺便问一下,为什么你有3x = 检查它是否等于 'xmlhttprequest'? - DrLime2k10
1
=== 检查它们是否是相同的类型。使用两个可能就足够了。 - Sweam

2

那是根本不可能的。

您需要限制服务器上每个IP地址的请求次数。


非常感谢,如果能提供一个PHP的基本实现就太好了。谢谢。 - Adib Aroui

0

标准的做法是,在包含 AJAX 代码的页面中发送某种(时间相关的)令牌,然后将令牌与 AJAX 调用一起发送。直接使用 AJAX URL 的用户将不知道当前令牌值。


1
但是由于JavaScript是可见的,他们不会非常容易地对其进行反向工程吗? - DrLime2k10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接