2016-12-01 96 views

回答

0

你永远不能阻止发送HTTP请求(以及第三方,总之在网络级别阻止他们,他们连接到HTTP服务器之前,并限制您通过IP地址检测请求(请参阅下文))。

您可以尝试检测到该第三方并以不同方式处理该请求(例如立即返回403错误)。

检测第三方的主要途径有:

  • 他们的IP地址(这可能会改变,这可能与其他人共享)
  • 他们的用户代理字符串(这是不太可能改变除非他们试图逃避检测,但可能会与标准浏览器用户代理发生冲突)。
  • 他们缺乏凭据,比如cookie(这需要您在访问URL之前将这些凭据提供给其他人)。

但一般情况下,一个GET请求的URL应该是无害的。如果你试图阻止他们做出来,很可能是因为请求有副作用(比如从数据库中删除某些东西)。

如果是这样,那么解决方案是要求POST请求。 HTTP规范说GET requests should be safe

+0

我与你与他们堵在我访问的想法,但我试图阻止POST请求。哪个是我发送信息到Facebook的权利?我正在谈论聊天中的“消息已阅读”信息。换句话说,这是“我试图阻止Facebook强迫我发送一个帖子请求,更新他们关于我是否看到过这个消息”编辑:也许我奇怪地说了我的问题。我明白这可以解释为 – Glutch

+0

@Glutch - 哦。这听起来像是更适合[超级用户](http://superuser.com/)的东西(所有想到的明显解决方案都是“安装软件/配置浏览器”而不是“编程”) – Quentin

+0

我对半熟悉superagent,一直在使用它很多(做)请求。是否有可能“防止”与superagent发送的请求?我能以某种方式在浏览器插件中使用superagent来阻止我的浏览器发送POST请求吗? – Glutch

0

您可以阻止客户端的AJAX请求。

首先你需要覆盖XMLHttpRequest.prototype.open。在此函数中,使用提供的参数调用原始的open函数。然后存储对此XMLHttpRequestsend函数的引用。最后覆盖XMLHttpRequestsend函数。

在新的send函数中,比较提供给open函数调用的方法和后参数。如果它通过比较,请使用原始参数调用原始send函数。如果它没有通过,什么都不做,您已经成功阻止了请求。

function blockXHR(compare) { 
    const open = XMLHttpRequest.prototype.open; 

    XMLHttpRequest.prototype.open = function(method, url) { 
    open.apply(this, arguments); 

    const send = this.send; 

    this.send = function() { 
     if(compare(method, url)) { 
     return send.apply(this, arguments); 
     } 
     console.log('blocked request'); 
    }; 
    }; 
} 

下面的演示代码中的其余代码存在以演示如何使用它,它确实有效。为了简单起见,我使用了ECMAScript 2015 Language Specification中介绍的一些功能,但这些功能都不是完成此任务所必需的。

function blockXHR(compare) { 
 
    const open = XMLHttpRequest.prototype.open; 
 
    
 
    XMLHttpRequest.prototype.open = function(method, url) { 
 
    open.apply(this, arguments); 
 

 
    const send = this.send; 
 

 
    this.send = function() { 
 
     if(compare(method, url)) { 
 
     return send.apply(this, arguments); 
 
     } 
 
     console.log('blocked request'); 
 
    }; 
 
    }; 
 
} 
 

 
const requestFactory = (method, url, callback) => { 
 
    const xhr = new XMLHttpRequest(); 
 
    xhr.addEventListener('load', callback); 
 
    xhr.open(method, url); 
 
    xhr.send(); 
 
}; 
 
const comparisonFactory = (targetMethod, targetURL) => 
 
    (method, url) => !(method === targetMethod && url === targetURL); 
 
const callback = event => console.log(event.target.status); 
 

 
blockXHR(comparisonFactory('POST', 'http://placehold.it/1x1')); 
 
requestFactory('POST', 'http://placehold.it/1x1', callback); // blocked request 
 
requestFactory('GET', 'http://placehold.it/1x1', callback); // 200 
 
requestFactory('POST', 'http://placehold.it/1x1?hello', callback); // 200