1. JavaScript / Говнокод #16655

    +152

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    jQuery(document).ready(function (){
    	var setCookie = function (c_name, value, exdays) {
    		var exdate = new Date();
    		exdate.setDate(exdate.getDate() + exdays);
    		var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
    		document.cookie = c_name + "=" + c_value;
    	}
    	var getCookie = function (cname){
    		var name = cname + "=";
    		var ca = document.cookie.split(';');
    		for(var i=0; i<ca.length; i++){
    			var c = ca[i].replace(/^\s+|\s+$/gm,'');
    			if (c.indexOf(name)==0) return c.substring(name.length,c.length);
    		}
    		return "";
    	}
    
    	if (window.location.hash=='#stop' || (!getCookie('crimea_is_ukraine') && jQuery.inArray(codehelper_ip.Country,ciu_countries)>=0)){
    		if (typeof(_gaq)!='undefined'){
    			_gaq.push(['_trackEvent', 'Protest', 'Show', 'Crimea is Ukraine']);
    		}

    http://putlerstop.2-you.info/share/stop_putler.js

    Запостил: gost, 07 Сентября 2014

    Комментарии (39) RSS

    • Без политики, пожалуйста.
      Ответить
    • Намкрыш.
      Ответить
    • Да тут можно начинать цитировать с самого начала. Например, с вот этого:
      document.write('<scr'+'ipt type="text/javascript" language="Javascript" src="http://www.codehelper.io/api/ips/?js"></scr'+'ipt>');
      Ответить
      • '<scr'+'ipt ...>
        Обфускация?
        Ответить
      • Если ты чего-то не понимаешь, это не делает непонимаемое говнокодом. http://learn.javascript.ru/document-write
        Ответить
        • Ну-ка, раскрой нам, дуракам, сакральный смысл document.write() в данном коде. Ну помимо недообфускации.
          Ответить
          • В том что он возвращает объект codehelper_ip с данными о пользователе
            Ответить
            • Отдельным блоком, без извращений с document.write(), не заработает разве?
              Ответить
              • Суть в том что http://putlerstop.2-you.info/share/stop_putler.js является скриптом который можно подключить на любой сайт. А document.write() внутри него аналог инклуда.
                Ответить
                • > является скриптом который можно подключить на любой сайт
                  Теперь понял. Спасибо.
                  Ответить
                  • А вставить через DOM не лучше, чем document.write?
                    Ответить
                    • А дом к тому моменту еще недостроен, если я не туплю.

                      P.S. Хотя можно дождаться события о загрузке, и там уже и грузить скрипт через добавление document.createElement('script') к дому... Это, емнип, и загрузку блочить не будет, в отличие от write...
                      Ответить
                      • Спёрто не-помню-с-какого-сайта для асинхронной загрузки виджетов соцсетей:
                        function async_load(u, id) {
                                if (!gid(id)) {
                                    var s = 'script', d = document, o = d.createElement(s), x;
                                    o.type = 'text/javascript';
                                    o.id = id;
                                    o.async = true;
                                    o.src = u;
                                    x = d.getElementsByTagName(s)[0];
                                    x.parentNode.insertBefore(o, x);
                                }
                            }
                        Так делают и всё работает, всё всем платится. Хотя... кажется, вызывают эту функцию после события о загрузке.

                        Только в данном случае нужно сделать без async, потому что ниже используются результаты выполнения загруженного кода.
                        Ответить
                        • > x.parentNode.insertBefore(o, x);
                          Вставить его перед всеми остальными скриптами? Ну-ну, они один хер уже исполнились :)

                          P.S. А, это как раз потому, что document.body еще null, а вот как минимум один скрипт (который сейчас и исполняется) уже спарсился и есть в доме. Т.е. ждать события о загрузке не нужно. Хитрый план.
                          Ответить
                          • Ну в данной задаче это всё равно костыль, потому что нужно исполнять полученный код, хотя он по идее должен содержать только данные. А всё потому, что кроссдоменный AJAX работает не везде.

                            Хотя раз уж мы используем jquеry, можно просто написать $.getJSON(...). Увидев, что запрос кроссдоменный, jquery сам допишет обёртку.

                            Кстати, я вообще не понимаю, зачем в таком примитивном скрипте используется jquery (наличие которого скрипт не проверяет и сам подгрузить не может), хотя можно было сделать всё без него и не требовать лишних зависимостей.
                            Ответить
                            • > сам подгрузить не может
                              Может. К примеру, тем же хаком с document.write().
                              Ответить
                              • Может. Но в текущей версии не реализовано.

                                P.S. Немножко для розжига на тему «document.write vs DOM»:
                                http://stackoverflow.com/questions/367214

                                P.P.S. http://learn.javascript.ru/document-write
                                Ответить
                        • Вот только все способы помимо XHR пугают своей небезопасностью: что при иньекции обычного скрипта, что при иньекции скрипта с jsonp, сервер API может подсунуть произвольный код, и браузер с радостью его исполнит.
                          Ответить
                          • Доверяй серверу.
                            Обычный сервер тебе может подсунуть произвольный код безо всяких проблем. (Что регулярно и происходит.)
                            Ответить
                            • > тебе
                              Здесь я рассматриваю ситуацию не с точки зрения юзера, а с точки зрения разраба сайта: я хочу просто получить немного инфы через некое API, а мне присылают скрипт, который несет потенциальную угрозу посетителям моего сайта (и, соответственно, моей репутации). Веб такой веб.
                              Ответить
                              • Разраб (если сайт не статический И исходящие запросы с сервера разрешены) может обращаться к API на стороне сервера.
                                Ответить
                                • Пример такого решения: Яндекс написал для себя обёртку, получающую у Гугла количество нажатий «+1», и возвращающую JSONP:
                                  http://share.yandex.ru/gpp.xml?url=http://govnokod.ru/
                                  Ответить
                • P.S. Но сама идея с подключением левых скриптов к своему сайту, имхо, не самая лучшая... Это ж добровольный XSS... Все равно что ключи от квартиры или пароли от сервака отдать кому-нибудь с улицы.

                  Для cdn'ок гугла и прочих серьезных контор я, пожалуй, сделаю исключение. А остальные - нахуй и впизду.
                  Ответить
                  • и большой брат будет знать где ты ходишь.
                    На гитхабе был скрипт, который имитирует apis.google.com итп
                    Ответить
                    • > ты
                      Ну, в данном случае, не я, а все мои гипотетические посетители.

                      P.S. Если гугл своей CDN'кой начнет раздавать троянов вместо jQuery и пиздить куки - это будет неплохим ударом по его репутации. Поэтому он так делать не будет (скорее всего). В отличие от всяких стоп-путлеру, которым терять особо то и нечего.
                      Ответить
                      • Гугл может внезапно начать раздавать троянов, при этом сам Гугл может этого не знать. Кроме доверия серверу, должно быть ещё доверие провайдеру:
                        http://habrahabr.ru/post/142909/
                        https://github.com/twbs/bootstrap/issues/401
                        Ответить
                        • > доверие провайдеру
                          Ну провайдер в любой сайт может вставить.
                          Ответить
                        • Провайдеры сотовых сетей педерасты (в плохом смысле) по-умолчанию.
                          Я до сих пор помню, как мегафно рвал воип-сессии, или воровал номер, на который звонили, прям из пакетов, и выставлял счёт как за звонок по сотовому.

                          От них давно пора поднимать впн на доверенный сервер.
                          Ответить
                          • ВПН? Террорист! Законопослушным гражданам от государства скрывать нечего!!111адын-адын-адын
                            Ответить
                          • > и выставлял счёт как за звонок по сотовому
                            О_о. Можно пруф?
                            Ответить
                            • > Можно пруф?
                              Х.з., поищу ещё, если не забуду, пока навскидку не нашёл.
                              Ответить
        • Всё верно. Непонимание также не делает непонимаемое хорошим кодом.

          API codehelper.io может возвращать JSON (http://www.codehelper.io/api/ips/?json) и JSONP (http://www.codehelper.io/api/ips/?jsonp&callback=trololo).

          Можно выбрать JSONP, чтобы не срать в глобальные переменные.
          Ответить

    Добавить комментарий