Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

Referer偽装

userChrome.js Firefox

いままでfirefox userChrome.js greasemonkeyスクリプトスレ の80氏が作った
misc.uc.js
の中のスレッドで修正されたfakeRefererを使っていたんだけどだけどなんかTumblrが無理っぽくなったのでこれにRefControlのForgeの設定を付け加えてみた。

RefControlの設定画面なんてほしくない!シンプルなFirefoxがいい!
という方や、
userChrome.js最高!
という方はどうぞ。

fakeReferer:{
let Cc = Components.classes;
let Ci = Components.interfaces;
let list = Cc['@mozilla.org/appshell/window-mediator;1'].getService(Ci.nsIWindowMediator).getEnumerator('navigator:browser');
while(list.hasMoreElements()){ if(list.getNext() != window) break fakeReferer; }
var sites = {
'tumblr.com' : '@FORGE',  //そのまま tumblr.comってするとプロパティと間違われたのでこんなかんじに
};
var adjustRef = function (http, site) {
try {
  var sRef;
  var refAction = sites[site];
  if (refAction == undefined)
    return false;
  if (refAction.charAt(0) == '@'){
    switch (refAction){
      case '@NORMAL':
        return true;
      case '@FORGE':
        sRef = http.URI.scheme + "://" + http.URI.hostPort + "/";
        break;
      default:
        return false;
    }
  }
  http.setRequestHeader("Referer", sRef, false);
  if (http.referrer)
    http.referrer.spec = sRef;
  return true;
} catch (e) {}
  return false;
}
Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService).addObserver({
observe: function(subject,topic,data){
if(topic != 'http-on-modify-request') return;
var http = subject.QueryInterface(Ci.nsIHttpChannel);
for (var s = http.URI.host; s != ""; s = s.replace(/^.*?(\.|$)/, "")){
if (adjustRef(http, s))
return
}
if(http.referrer && http.referrer.host != http.originalURI.host)
http.setRequestHeader('Referer', http.originalURI.spec.replace(/[^/]+$/,''), false);
}
},'http-on-modify-request',false);
}

userChrome.js用です。Firefox2で動作確認。meta情報として

// ==UserScript==
// @name        fakeReferer mod
// @include     main
// @include     chrome://browser/content/browser.xul
// ==/UserScript==

みたいなのをつけてご利用ください。
ReblogCommandが使えたので個人的には満足。RefControlからほしいところだけ持ってきただけなのでたいしたことはしていません。80氏とRefControlの作者に感謝。

この方法か、SITEINFOのように

var sites = [
{
url : 'tumblr.com',
type: '@FORGE'
}
]

ってやってforで調べたほうが無駄がないのかは不明。
RefControlの仕様上、ドメイン指定で

  • @FORGE : RefControlのForge
  • @NORMAL : そのまま
  • 無指定 : fakeRefererの本来の機能(リファラが開こうとしているドキュメントと別のサーバーだと,ドキュメントと同じサーバーから開かれたように偽装する)

の3つが設定できる。

補足

必要に駆られてせかせか作ったので無駄とかおかしいところがあるかも。
何かあれば指摘していただけるとありがたいです。

Remove all ads