2010-09-28 3 views
0

Так что я недавно работал над скриптом, чтобы обмануть клиентский код для защиты интеллектуальной собственности, не мешая появлению интерактивности полученной страницы. Процесс выглядит следующим образом:AJAX, возвращающий javascript для анализа, приводит к потере содержимого страницы

  1. запрос HTTP приходит, .htaccess перенаправляет к parse_request.php
  2. parse_request.php создает класс "phpURLParser" класс которого переменные являются по существу копиями $ _SERVER (*). переменные
  3. phpURLParser просматривает запрошенный путь, а иногда и хост, референт или другую серверную информацию, чтобы определить, как реагировать. Существует несколько возможных ответов

a. Запрошенным объектом был файл .js или .css. Передайте файл на компрессор YUI и отправьте выходные данные

b. Запрошенным объектом является изображение или приложение. Передайте файл без изменений

c. Запрошенный объект содержит HTML. Заменить каждый символ ASCII с 2-значным шестнадцатеричным эквивалентом и отправить следующий JavaScript:

<script type="text/javascript"> 
var x="~lots of hex~"; 
var y=""; 
for(i=0; i<x.length; i+=2){ 
    y += unescape('%'+x.substr(i,2)); 
} 
document.write(y); 
</script> 

Так сайт заменяются большим количеством гекса и небольшая JavaScript, чтобы вернуть гекс к своей первоначальной форме. У меня есть пример этой установки на examples.chikachu.com/colorbox/example1 (я не кодировал ColorBox, это бесплатный инструмент jQuery, который я выбрал для использования, так как это позволило мне протестировать несколько различных функций javascript и убедиться, что они все работал)

Теперь проблема:

Как оказалось, это работает 99% времени. Но AJAX сердится. Щелчок одного из примеров AJAX (в разделе «Другие типы содержимого») будет выглядеть так, как будто он перенаправляет вас на новую страницу. Однако просмотр в адресной строке или просмотр источника страницы докажет, что вы все еще на одной странице. Использование инструмента Inspect Element в Chrome (или Firebug в Firefox) покажет, что содержимое веб-страницы было полностью заменено содержимым запроса AJAX.

Если я немного изменю parse_request.php, чтобы файл, запрошенный AJAX, прошел через невредимый, все работает. Нет проблем. Поэтому по какой-то причине мой скрипт, который заменяет строку hex своим значимым HTML-копиром, перезаписывает весь сайт, а не красиво вставляет себя в пределы объекта <div>.

По существу здесь ожидаемое без запутанного HTML:

<html> 
<head> 
    ... 
</head> 
<body> 
    <div id="colorbox"> 
     <INSERT AJAX HERE> 
    </div> 
    ... 
</body> 
</html> 

С только AJAX затемненной, я ожидаю следующее:

<html> 
<head> 
    ... 
</head> 
<body> 
    <div id="colorbox"> 
     <script type="text/javascript"> 
     var x="asdfasdfasdfasdf"; 
     var y=""; 
     for(i=0; i<x.length; i+=2){ 
      y += unescape('%'+x.substr(i,2)); 
     } 
     document.write(y); 
     </script> 
    </div> 
    ... 
</body> 
</html> 

Я ожидаю, что document.write() линии здесь будет напишите y в местоположении javascript (в пределах <div>). Если я ошибаюсь, и это не так, как работает document.write(), я все еще ожидаю, что он напишет y в конце документа. Вместо этого весь документ заменяется на y. Почему это, и каково мое решение?

+0

Ошибка установления соединения с базой данных – vol7ron

+0

Я думаю, что 'document.write()' пишет в момент времени, это событие-событийная и его вывод является нерегулярным в зависимости от загрузки страницы. Это может сломать всю вашу страницу, вы должны рассмотреть возможность использования 'innerHTML' или' textNode' для вставки текста adhoc. Однако, если вы хотите выполнить, я думаю, вам понадобится document.write, поскольку innerHTML не позволит это произойти, по крайней мере для внешних скриптов. – vol7ron

+0

Вы также должны пересканировать переменную счетчика и кэшировать длину строки 'for (i = 0; i vol7ron

ответ

0

попробовать что-то вроде этого:

<html> 
<head> 
    ... 
</head> 
<body> 
    <div id="colorbox"> 
     <div id="MYAJAXCONTENT"> 
     </div> 
     <INSERT AJAX HERE> 
    </div> 
    ... 
</body> 
</html> 

<html> 
<head> 
    ... 
</head> 
<body> 
    <div id="colorbox"> 
     <script type="text/javascript"> 
     var x="asdfasdfasdfasdf"; 
     var y=""; 
     for(i=0; i<x.length; i+=2){ 
      y += unescape('%'+x.substr(i,2)); 
     } 
     document.getElementById('MYAJAXCONTENT').innerHTML = y; 
     // for the jQuery psychos out there 
     // $('#MYAJAXCONTENT').html(y); 
     </script> 
    </div> 
    ... 
</body> 
</html> 
+0

Только проблема с этим - код был предназначен для ненавязчивого обфускания ЛЮБОГО кода. Это предполагает, что у меня есть элемент, предварительно размещенный на странице. Тем не менее, я работал над аналогичным решением, предоставляя сценарию сам идентификатор (сгенерированный parse-request.php), после чего сам скрипт обнаруживает getElementById и вызывает его parentNode. – stevendesu

+0

@steven_desu - у вас уже есть элемент с идентификатором. Вы можете легко использовать javascript для добавления дополнительных элементов к нему на лету и вставлять в него новые сценарии. –

1

Ответ на ваш последний вопрос: Вызов

document.write ('my_precious_html_code');

будет добавлять или переопределять текст на странице в зависимости от того, когда он был вызван (до или после события onLoad). Вы не должны использовать его любой скрипт. Узнайте больше об этом здесь: http://javascript.crockford.com/script.html

Общий ответ: Обфускание HTML-кода не имеет никакого смысла. Точно так же, как защита изображений путем отключения правой кнопки мыши в конце 90-х. Мне потребовалось меньше 3 секунд, чтобы «взломать» ваш запутанный код и получить красиво отформатированный HTML. Также ваш сайт отображается в режиме quirks, который, вероятно, вы не хотите.

+0

Я подумал, что его можно было легко взломать. Предположим, что с помощью функции Inspect Element в Chrome трещины для вас (Chrome выведет текущие HTML, опубликует изменения в JavaScript). Я просто подумал, что это будет достаточно раздражать, чтобы удержать людей. Хороший момент, однако, что это как отключить правый клик. Довольно бесполезно, я полагаю. Если ничего другого, это был забавный проект, чтобы отвлечь меня во время стат-класса =) – stevendesu