Итак, я недавно работал над сценарием, чтобы запутать клиентский код для защиты интеллектуальной собственности, не мешая появлению интерактивности полученной страницы. Процесс выглядит следующим образом:
- HTTP-запрос приходит, .htaccess перенаправляет (. *) В parse_request.php
- parse_request.php создает класс "phpURLParser", чьи переменные класса по сути являются копиями переменных $ _SERVER
- phpURLParser просматривает запрошенный путь и иногда информацию о хосте, реферере или другой серверной информации, чтобы определить, как реагировать. Есть несколько возможных ответов
а. Запрашиваемым объектом был файл .js или .css. Передайте файл в YUI Compressor и отправьте вывод
б. Запрашиваемый объект - это изображение или приложение. Передать файл без изменений
с. Запрашиваемый объект содержит HTML. Замените каждый символ ASCII его двузначным шестнадцатеричным эквивалентом и отправьте следующий код 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 (в разделе «Другие типы контента»), вы увидите, что он перенаправляет вас на новую страницу. Однако просмотр адресной строки или просмотр источника страницы покажет, что вы все еще находитесь на той же странице. Использование инструмента проверки элементов в Chrome (или Firebug в Firefox) покажет, что содержимое веб-страницы было полностью заменено содержимым запроса AJAX.
Если я немного изменю parse_request.php, чтобы позволить файлу, запрошенному AJAX, пройти без повреждений, все работает. Нет проблем. Поэтому по какой-то причине мой скрипт, который заменяет строку hex шестнадцатеричным значением, перезаписывает весь веб-сайт, а не просто вставляет себя в пределы
объекта.
По сути, вот ожидаемый, не запутанный 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 (в пределах
). Если я ошибаюсь, и это не то, как document.write () работает, я все еще ожидаю, что он напишет y в конце документа. Вместо этого весь документ заменяется на y. Почему это так и каково мое решение?