2016-12-01 81 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