Анонимный хостинг или интересный концепт на Javascript

В июльском выпуске журнала Хакер (150) в рубрике Proof-of-Concept была опубликована статья, которую можно назвать "Анонимный хостиг на javascript". Материал показался мне интересным, но сам код представлен не был и я решил подробно написать и расписать все шаги.
Смотрим что к чему. Есть идея, что бы сохранить обыкновенную html страницу в виде http://goid.ru/8nl . В чём подвох ? А вот в чём, весь контент страницы мы запихнули в URL, а затем с помощью сервиса сокращения ссылок ( например goid.ru или goo.gl ) сохранили этот контент на серверах сокращалок. При щелчке по короткой ссылке мы будем получать с сервера сокращалки нужную нам страницу. Фактически мы при этом используем сокращалку как хостера, заставляя его хранить не просто адрес страницы а саму страницу ! Но есть и ложка дёгтя в этой бочке мёда:
  1. Нам нужна страничка для обработки закодированной URL ( есть идеи как это обойти ).
2. Сокращалки накладывают ограничения на длину адресной строки. В goo.gl например это примерно 2,5K, а в goid.ru 5K. Одним словом нужно пробовать с разными сервисами.
Ну а теперь подробно как это делается.
Берём нужную нам html страничку, например простейшую:




И кодируем её в base64, например здесь. Теперь нам нужен javascript который будет обрабатывать и выводить в браузере нашу страницу в удобочитаемом виде. Вот и сам скрипт:


decandwr();
function decandwr() {
var Base64 = {

//Декодирование из Base64
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;

input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

while (i < input.length) {

enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));

chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;

output = output + String.fromCharCode(chr1);

if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}

}

output = Base64._utf8_decode(output);

return output;

},

//Декодирование из Utf8
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;

while ( i < utftext.length ) {

c = utftext.charCodeAt(i);

if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}

}

return string;
}

}


//Получения адресной строки
var input=location.href;
//Удаление лишних символов и последующая декодирование строки
input=input.split("?a=");
var result=Base64.decode(input[1]);
//Отображение декодированной строки
var searchid=document.getElementById("base");
base.innerHTML=result;
}

Осталось где нибудь разместить этот скрипт и добавить к нему в URL нашу закодированную страничку. Например мы разместили наш скрипт на локальном сервере, значит наш URL будет выглядеть как то так:
http://localhost/base64.html?a=PGltZyBzcmM9ImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsLzlqLzR
BQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3Q0VBQWtHQmdnR0VBa1REaE1XRUJVVU
RSWU9HQmdRRkJjVUV4QVhGQmdWRng4YkdoY1hJRElxSXlVdkpSNGVLeThqSkRNcExD
MDRGU0l4TlR3ME5TWXJMeWtCQ1FvS0RRc05HUTRPR1RVa0hpUTFOVFUxTlRVMU5U
RTFOVFUxTlRVMU5UVTFOUzAxTkNvME5UVTFMVFUxTlRVMU5UVTFOVFUxTlRFMU
tUVXBLUzAxTFAvQUFCRUlBRElBTWdNQklnQUNFUUVERVFIL3hBQWNBQUVBQVFV
QkFRQUFBQUFBQUFBQUFBQUFCd0VDQlFZSUF3VC94QUF2RUFBQkF3SUVCUUVIQlF
BQUFBQUFBQUFCQUFJREJSRUVFaUZ4QmdjeFFaRmhFeUl5Z2FIQjBVSkRVckh4LzhRQU
d3RUFBZ0lEQVFBQUFBQUFBQUFBQUFBQUJRWUVCd0FDQXdIL3hBQXJFUUFCQXdJ
REJBc0FBQUFBQUFBQUFBQUJBQUlEQkJFRkVqRUdFeUh4SWlNeVFWRmhrYkhCMGZE
LzJnQU1Bd0VBQWhFREVRQS9BTmJKT3U2cGNvZSs2K2luWUNhcXl3UlJhdWUvSUw5Qj
Y3V1NxQVNiQlhRNXpXTkxuYUJlMUlvdFFycnl6RE1NaEhYV3pXYnVQUlpPcmNCMTJqT
U1qMkI3QUxreE96WmR4MSthbUdnMFBDOFBReHhRalFBRW0zdlBkM2NWa3lMb3d5Z2JsN
lI0cEZtMm5sMzNWTkdRZU9wK2x6Vm11bHl0eTVrY0tNb3NySm9CYUtWMWlCMGpmK0Q
rVnBxRlN4bU54YVU1VWxUSFZ3aWFQUS9yS3R5aUl1YWxLaDc3cVFlVU5LRTB1TW5Q
N2JSQzMwTHRUOUxlVkh4NzdxWGVVYkd0d1U1N25GUHY4ZzFUS0p0NWdnVzBFcGp
vSFc3N0JieUVSRWZWWkxEY1cwdHRad2VOakkxOW1YTjlITjk0ZlVLQWhyWmRLa1hY
TjJMYTFrazRIUVNPQThsQ2NSYUx0Y25qWldWeFpMRWRCWSt2SldJaUlVbk5VUDNV
aWNvNnpIQy9GWVo1c1hrVE05U0JadzhXUGxSMmUrNnZnbWx3em1PWTRzYzA1Z1JvU
VF1ME1tNmVIS0JYMGpheW5kQ2VGL2RkSm9vdm8vTng4VFd0eGtSZVFMWjRyQys3VD
lsa01WemZwckFmWlF5dk52MVpXRHpjbzJLdUVpK1pWMi9BNjlyOHU3djVpMWx0UEUx
WmpvT0Z4TXJqcUdsclIvSjU2RHl1ZjllLytyTThSOFU0L2lkN1hUSEsxdndzYjhETC93Qm4x
S3c2RlZjNG1kdzBDZDhGdzAwRUp6OXAydndGVkVSUTBjWG9XalhkTW9SRnN1U1pR
bVVJaXhlcGxDRm9SRml4VzJSRVdxOVgvOWs9IiBhbHQ9ItCc0KLQoSI+INCh0LvQvtCy
0L4gwqvRhNGA0L7QtMK7ICjQvtGCINCw0L3Qs9C7LiBmcmF1ZCDigJQg0LzQvtGI0LX
QvdC90LjRh9C10YHRgtCy0L4pINCyINGB0L7QstGA0LXQvNC10L3QvdC+0Lwg0LvQtd
C60YHQuNC60L7QvdC1INC+0LfQvdCw0YfQsNC10YIg0LLQuNC0INC80L7RiNC10L3Q
vdC40YfQtdGB0YLQstCwLCDRgdCy0Y/Qt9Cw0L3QvdGL0Lkg0YEg0LjQvdGE0L7RgNC
80LDRhtC40L7QvdC90YvQvNC4INGC0LXRhdC90L7Qu9C+0LPQuNGP0LzQuC4gwqvQ
pNGA0L7QtCDQsiDRgNC+0YPQvNC40L3Qs9C1wrsg4oCTINC80L7RiNC10L3QvdC40Y
fQtdGB0YLQstC+INGB0L4g0LfQstC+0L3QutCw0LzQuCDQsiDRgNC+0YPQvNC40L3Qs
9C1LiDQn9GA0L4g0L7QtNC90YMg0LjQtyDRgtCw0LrQuNGFINGB0YXQtdC8INGA0LD
RgdGB0LrQsNC30LDQuyDQlNC80LjRgtGA0LjQuSDQktC40L3RhtC10LLQuNGHLCDQv
dCw0YfQsNC70YzQvdC40Log0LTQtdC/0LDRgNGC0LDQvNC10L3RgtCwINCx0LXQt9C
+0L/QsNGB0L3QvtGB0YLQuCDCq9Cc0KLQoSDQo9C60YDQsNC40L3QsMK7LiDQmtC
w0Log0YDQsNGB0YHQutCw0LfQsNC7INCzLdC9INCS0LjQvdGG0LXQstC40Ycg0LjQt9
C00LDQvdC40Y4gwqtNVFNUT0RBWcK7LCDRgdCw0LzRi9C8INGP0YDQutC40Lwg0L
/RgNC40LzQtdGA0L7QvCDQv9C+0YHQu9C10LTQvdC40YUg0LvQtdGCINGB0YLQsN
C70LAgwqvRgNCw0LHQvtGC0LDCuyDQs9GA0YPQv9C/0Ysg0LjQtyDQv9GP0YLQuC
DQvNC+0LvQvtC00YvRhSDQu9GO0LTQtdC5INCy0L7Qt9GA0LDRgdGC0L7QvCAyNy0
zNyDQu9C10YIsINC60L7RgtC+0YDQsNGPINC30LAgMiw1INCz0L7QtNCwINC90LDQ
vdC10YHQu9CwINGD0YnQtdGA0LEg0L7Qv9C10YDQsNGC0L7RgNCw0LwgwqvQnNC
i0KEg0KPQutGA0LDQuNC90LDCuyDQuCBsaWZlOikg0L3QsCDRgdGD0LzQvNGDINC/
0L7RgNGP0LTQutCwIDE1INC80LvQvSDQs9GA0LjQstC10L0uPGEgaHJlZj0iaHR0cDovL2
Jsb2cuaW1lbmEudWEvJUQwJUI1JUQxJTg5JUQxJTkxLSVEMCVCRSVEMCVCNCVEMC
VCRCVEMCVCMC0lRDElODElRDElODUlRDAlQjUlRDAlQkMlRDAlQjAtJUQwJUJDJU
QwJUJFJUQwJUIxJUQwJUI4JUQwJUJCJUQxJThDJUQwJUJEJUQwJUJFJUQwJUIzJUQw
JUJFLSVEMCVCQyVEMCVCRSVEMSU4OCVEMCVCNSVEMCVCRCVEMCVCRCVE
MCVCOCVEMSU4NyVEMCVCNSVEMSU4MS8iIGFsdD0i0KTRgNC+0LQg0LIg0YDQvt
GD0LzQuNC90LPQtSIgdGl0bGU9ItCk0YDQvtC0INCyINGA0L7Rg9C80LjQvdCz0LUiPtCf
0L7QtNGA0L7QsdC90LXQtTwvYT4=

Осталось только прогнать этот астрономически длинный URL через сокращалку и мы получим примерно такую вот строку http://goid.ru/xxxxx . Мы сумели всунуть в эти несколько символов не только целую HTML страницу, но и поместить туда небольшое изображение, что согласитесь весьма неплохо.
Итак, что мы имеем на выходе:
  1. Интересный концепт, правда неясно где его можно использовать.
  2. Главный недостаток - необходимость в ресурсе для хранения скрипта, и именно в этом направлении и следует работать.
В любом случае идея интересная. Буду рад если кому то мой пост окажется интересным и полезным. Всем успехов !









Комментарии

Популярные сообщения из этого блога

Простой скрипт проверки доступности хоста

Генератор русских имён и фамилий на Python

Букмарклет для скачивания видео с SaveFrom