是否可以強制chrome不發送XMLHttpRequest上的cookie標頭。我看到Firefox有一個匿名參數,但在chrome/webkit上有類似的東西嗎?是否可以強制XMLHttpRequest不發送鉻中的cookie?
回答
不幸的是,目前在webextensions中沒有直接的方法(包括Firefox和Chrome)。讓我們來看看選擇:
- 使用
fetch
,而不是XMLHttpRequest的 - 修改請求頭使用webRequest API
選項1具有的魅力,它不涉及黑客,但不足之處是, fetch
目前仍缺少XMLHttpRequest
中的一些功能。這是否是一個問題,取決於具體的例子。
選項2需要權限才能使用webRequest API,這需要額外的權限。它看起來比它應該更復雜。儘管如此,這是我工作的唯一方式,可以在今天的瀏覽器上使用(2017年11月)。
但讓我們看看兩個選項的細節。
選項1:獲取API和它的侷限性
當你提到在Firefox匿名請求,我敢肯定,你的意思是這樣的代碼:
let xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
.createInstance(Components.interfaces.nsIXMLHttpRequest);
xhr.open('GET', 'http://www.example.com');
xhr.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_ANONYMOUS;
xhr.send();
隨着XMLHttpRequest
在Chrome中是不可能,但最近你可以得到的是避免使用fetch API發送cookie,它有一個類似的選項credentials
,它可以讓你控制是否應該包含cookie('include'
)或不包括('omit'
):
fetch('http://www.example.com', { credentials: 'omit' }).then(...);
這將在不設置任何cookie的情況下發出GET請求。
與XMLHttpRequest
相比,功能方面仍然存在一些限制。從我的角度來看,最緊迫的問題是您無法放棄以fetch
開始的請求,您也無法控制超時。
支持中止fetch
(請參閱AbortController API)有一個新標準,但它目前僅在Firefox 57和Edge(2017年11月)上實現。它很快就會到達Chrome,但是如果您現在需要使用該功能,則可能無法等到所有瀏覽器都支持該功能。
不過,一旦AbortController
在那裏,我認爲它會成爲避免發送cookie的首選方式。
選項2:WebRequest的API,並去掉「曲奇」頭手動
如果你需要一個有效的解決方案,現在,你在擴展訪問的WebRequest API的權限,你可以安裝一個onBeforeSendHeaders
監聽器並手動刪除Cookie
標題。
爲了得到一個想法,這是怎麼可能看起來像:
chrome.webRequest.onBeforeSendHeaders.addListener((details) => {
return {
requestHeaders: details.requestHeaders.filter(x => x.name.toLowerCase() !== 'cookie');
};
}, { urls: ['<all_urls>'] }, ['requestHeaders', 'blocking']);
但你必須要小心,你不小心修改相關請求。在實際實施中,您應該驗證details.requestId
是否匹配。爲了訪問請求ID,我使用了另一個onBeforeRequestListener並驗證請求的URL是否匹配。請求完成後,所有偵聽器都會再次被刪除。 (有關更多詳細信息,請參見How to get the requestId of a new request?。)
從我所看到的情況看,它可行,但它不是一個非常優雅的解決方案。
總結:
取API:
- (+)直接的解決方案經由
crendentials: 'omit'
其旨在
- (+)的新標準,以取代
XMLHttpRequest
- ( - )電流的瀏覽器還不支持所有功能(超時,取消)
的WebRequest API:
- (+)適用於當今的瀏覽器(Chrome上測試)
- ( - )對一個簡單的問題非常複雜的解決方案
- ( - )需要額外的權限來使用它
- 1. 是否可以在XmlHttpRequest中發送Windows登錄憑據?
- 2. 是否可以使用Twilio-csharp/TwilioRestClient發送帶有SMSMessage的cookie?
- 3. 用XMLHTTPRequest發送一個cookie(TVMLJS)
- 4. jQuery是否在帖子中發送cookie?
- 5. 是否可以強制更新接口?
- 6. XMLHttpRequest。不以UTF-8發送數據。任務是不可行的嗎?
- 7. 是否可以強制Grails/Gorm在插入中不包含列?
- 8. 是否可以強制遏制不使用Keep Alive?
- 9. 頭的XMLHttpRequest鉻
- 10. 是否可以強制彈出菜單而不是鼠標懸停而觸發?
- 11. 是否可以對XMLHTTPRequest使用Digest-Authentication?
- 12. 是否可以跨域使用XMLHttpRequest
- 13. 是否可以在PHPMAILER中發送不同的主體內容?
- 14. 不發送的cookie
- 15. 是否可以訪問cookie並且沒有在請求頭中發送它?
- 16. 是否可以發送Wireshark/libpcap不可見的數據?
- 17. Ruby HTTPClient檢查cookie是否被髮送
- 18. 是否可以發送日誌到Logstash
- 19. iPad - 是否可以發送短信?
- 20. 如何監控cookie是否發送至域名以外的域?
- 21. XMLHttpRequest不發送文件
- 22. xmlHTTPRequest POST不發送數據
- 23. 是否可以發送Feed以更新在foursquare中的列表?
- 24. xmlhttprequest在擴展中的鉻
- 25. 鉻中的XMLHttpRequest錯誤
- 26. 的XMLHttpRequest,發送和安全限制
- 27. 是否可以阻止/拒絕Java中的強制轉換?
- 28. 是否可以強制c中宏的評估?
- 29. 是否可以強制樣式表中的「字體優先級」?
- 30. 是否可以讀取訪客的Cookie?