Что не дает скрипту работать

Почему не работает тот или иной скрипт…

«Почему не работает тот или иной скрипт…» — такой вопрос довольно часто задают мне читатели рассылки и посетители сайта по электронной почте или в комментариях к некоторым Скриптам, опубликованных на сайте.

Сразу оговорюсь, что речь в данной статье пойдет только о Скриптах, которые я публикую на страницах своего сайта http://www.LuksWeb.ru/, хотя большинство советов, о которых пойдет речь ниже, справедливы и для других Скриптов, которые Вы найдете на просторах Интернета.

Чтобы нам разговаривать на «одном языке», давайте уточним некоторые понятия. Что мы вообще понимаем под понятием: СКРИПТ?

Что такое Скрипт?

Скрипт – это небольшая программка, расширяющая функциональность сайта. Скрипт внедряется в код основной web-страницы, написанной на HTML, PHP или других языках программирования. Скрипты чаще всего пишут на языках JavaScript и PHP, а также других языках. Скрипт (программа) может содержать всего несколько строк кода, но бывают и довольно объемные Скрипты, содержащие несколько страниц кода. Это может быть например вывод даты или времени на сайте, а может быть полноценная игра.

Скрипты могут внедряться (подключаться) как в код основной web-страницы, так и выносится в отдельные файлы и подключаться к web-странице с помощью специальных операторов. Если скрипт выносится в отдельный файл, то такой файл обычно имеет расширение .js , .php. Но файлы с расширением .php могут иметь и просто файлы сайта (блога).

Читайте также:  Заставили отрабатывать две недели как не работать

На моем сайте Вы можете найти два раздела посвященные различным Скриптам: раздел с одноименным названием: Скрипты и раздел jQuery. Если Вам не понятно в чем разница пройдите по данным ссылкам, и Вы все поймете сами.

Зачем же изобретать велосипед.

Следующий момент, который мне хотелось бы отметить — это написание Скриптов. В настоящее время Интернет просто кишит скриптами практически всех стилей и направлений, написанных на любых языках. Поэтому не вижу смысла «изобретать велосипед» и писать Скрипты самому. Т.е. я хочу сказать, что сам пишу Скрипты полностью очень редко, чаще нахожу в Интернете Скрипт с нужным функционалом и иногда немного дорабатываю под свои задачи. Возможно, кто-то посчитает это неправильным, но поверьте все уже давно написано, нужно только найти и адаптировать нужный Скрипт под определенный проект (сайт), повторюсь: так зачем же изобретать велосипед.

Прежде чем опубликовать какой-то Скрипт на своем сайте, я его всесторонне тестирую и испытываю в различных браузерах, смотрю, как он работает в той или иной ситуации. И если обнаруживаю, что в каком–то браузере возникают проблемы, то так об этом и «говорю», публикуя каждый конкретный Скрипт.

Публикуя, какой либо скрипт у себя на сайте, стараюсь максимально подробно «разжевывать» процесс подключения каждого скрипта к web-странице, ведь далеко не все мои посетители в совершенстве знают языки программирования. Собственно говоря для того и публикую, чтобы рассказать новичкам как работают и подключаются Скрипты.

Почему не работает тот или иной скрипт?

А теперь давайте поговорим о том «Почему не работает тот или иной скрипт…».

Действительно не всегда, не у всех и не сразу Скрипты начинают работать, так как хотелось бы. Здесь можно выделить несколько основных причин.

1. Скрипт не работает в браузере …
В силу того, что между компаниями производителями программного обеспечения (в данном случае браузеров) постоянно идет конкурентная борьба, а так же не соблюдений этими компаниями требований консорциума WWW и спецификации HTML, увы, действительно один и тот же код скрипта может разными браузерами отображаться по-разному. А в некоторых случаях в одном браузере скрипт может работать прекрасно, а в другом браузере не работать вообще. Но как я уже сказал выше все эти момент я отображаю в описании скрипта, и если Вы не нашли в статье подобных ограничений или упоминаний, то это значит что скрипт работает во всех распространенных браузерах: IE, Opera, Google Chrome, Mozila Firefox.

Поэтому убедительная просьба: ВНИМАТЕЛЬНО ЧИТАЙТЕ ОПИСАНИЕ. Если Вы не нашли в описании подобных оговорок – это значит что просто Вы где то допустили ошибку. Вывод: ошибку нужно найти и устранить.

2. Скрипт не работает на Ucoz (или других конструкторах сайтов).
Сервисы подобные Ucoz, narod.ru и другие аналогичные конструкторы сайтов используют в своей работе свои собственные разработки. Как правило, подобные сервисы (конструкторы) позволяют создавать (компоновать) сайты из готовых блоков (модулей). При этом часто используют свои собственные языки программирования и разработки, которые подчас просто конфликтуют с общепринятыми языками программирования. В Интернете даже существует отдельное направление: Скрипты для Ucoz.

Кроме того подобные сервисы в большинстве случае умышленно ограничивают функционал размещенных у них сайтов. Ведь все Скрипты создают дополнительную нагрузку на сервер и отнимают ресурсы сервера. Администраторам подобных сервисов проще закрыть большинство функций и возможностей для пользователей, чем разбираться с проблемами и проводить модернизацию своего оборудования, ведь в первую очередь это ДЕНЬГИ! Они живут по принципу: не нравится наш БЕСПЛАТНЫЙ сервис – не пользуйтесь.

Если Вы столкнулись с подобной проблемой, попробуйте обратиться в службу поддержки сервиса и попросить помощи. Возможно, Вам и пойдут навстречу, но мой опыт показывает, что шансов очень мало.

3. РHP скрипт не работает на сервисе: narod.ru
Увы, но конструктор сайтов «НАРОД» (narod.ru) вообще не поддерживает PHP и Скрипты написанные на PHP здесь работать не будут. Так что не стоить даже пробовать и трать свое время и нервы.

4. Локально (под Денвером) скрипт работал без проблем, а после переноса на реальный Хостинг в Интернете Скрипт не работает, что делать?
Закачка на сервер Скриптов, как правило, осуществляется по протоколу FTP. При этом для некоторых Скриптов очень важен режим закачки файлов Скрипта (бинарный или текстовый). Если это критично, то в описании к Скрипту тоже будет указано в каком режиме необходимо закачивать скрипт, обязательно обращаете на это внимание.

Кроме того обратите внимание на права доступа файлов и папок Скрипта. Для некоторых Скриптов это тоже очень важный момент. При установке «неправильных» прав доступа Скрипт может не работать вовсе или в не полном объеме. Если подобное ограничение имеется, я обязательно указываю это в описании. Будьте внимательны читая описание!

Что делать если Скрипт не работает?

В первую очередь внимательно прочитайте описание по Скрипту, который Вы хотите развернуть на сервере в Интернете. Проверьте правильность написание кода. Обычно 80-90% проблем возникает именно из-за нашей невнимательности : закачали не в том режиме или неправильно выставили права доступа (это очень актуально для Unix ОС), потеряли какой-то знак в коде и т.д.

Обратите внимание на характеристики Хостинга. Особенно если ваш сайт размещается на бесплатном Хостинге или создан с помощью какого либо конструктора сайтов.

Если так и не удалось самостоятельно решить проблему и запустить скрипт, обращайтесь в службу техподдержки вашего Хостинга. Даже на бесплатных Хостингах такая служба существует и часто адекватно и оперативно реагирует на обращения своих клиентов.

А вообще проблемы с Хостингом можно решить очень просто – перейти на платный профессиональный Хостинг, тем более что сегодня приличный Хостинг стоит совсем не дорого. Вот один из таких Хостингов-провайдеров IPhoster . Самый ходовой тариф HOST1 стоит всего 1 дол. США в месяц! В разделе Веб-хостинг можно выбрать тариф на любой вкус.

Компания IPhoster предоставляет свои услуги по принципу «все включено» в независимости от тарифного плана, т.е. за свои деньги Вы получите полный набор профессиональных инструментов и вопрос о неработоспособности Скриптов из-за технических характеристик Хостинга отпадет сам собой.

Но о Хостингах мы поговорим подробнее в одной из следующих статей.

Всего Вам доброго.

Читайте также другие наши материалы:

Источник

Фундаментальная уязвимость HTML при встраивании скриптов

Чтобы описать суть проблемы, мне нужно рассказать, как вообще устроен HTML. Вы наверняка в общих чертах представляли себе, но я все равно коротко пробегусь по основным моментам, которые понадобятся для понимания. Если кому-то не терпится, сразу переходите к сути.

HTML — это язык гипертекстовой разметки. Чтобы говорить на этом языке, нужно соблюдать его формат, иначе тот, кто читает написанное, не сможет вас понять. Например, в HTML у тегов есть атрибуты:

Тут [name] — это имя атрибута, а [value] — это его значение. В статье я буду использовать квадратные скобки вокруг кода, чтобы было понятно, где он начинается и заканчивается. После имени стои́т знак равенства, а после него — значение, заключенное в кавычки. Значение атрибута начинается сразу после первого символа кавычки и заканчивается сразу перед следующим символом кавычки, где бы он не находился. Это значит, что если вместо [value] вы запишете [OOO «Рога и копыта».] , то значение атрибута name будет [OOO ] , а еще у вашего элемента будет три других атрибута с именами: [рога] , [и] и [копыта».»] , но без значений.

Если это не то, чего вы ожидали, вам нужно как-то изменить значение атрибута, чтобы в нем не встречалась кавычка. Самое простое, что можно придумать — просто вырезать кавычки.

Тогда парсер HTML верно прочтет значение, но беда в том, что это будет другое значение. Вы хотели [OOO «Рога и копыта»] , а получили [OOO Рога и копыта.] . В каких-то случаях такое различие может быть критичным.

Чтобы вы могли указать в качестве значения любую строку, формат языка HTML предлагает возможность экранировать значения атрибутов. Вместо кавычки в строке значения вы можете записать последовательность символов [«] и парсер поймет, что в этом месте в исходной строке, которую вы хотите использовать в качестве значения атрибута, была кавычка. Такие последовательности называются HTML entities.

При этом, если в вашей исходной строке действительно была последовательность символов [«] , у вас все еще есть возможность записать её так, чтобы парсер не превратил её в кавычку — для этого надо заменить знак [&] на последовательность символов [&] , то есть вместо [«] вам нужно будет записать в сыром тексте ["] .

Получается, что преобразование из исходной строки в ту, которую мы запишем между двумя символами кавычек, является однозначным и обратимым. Благодаря этим преобразованиям можно записать и прочитать любую строку в качестве атрибута HTML-тега, не вдаваясь в суть её содержимого. Вы просто соблюдаете формат, и все работает.

Собственно, так работает большинство форматов, с которыми мы сталкиваемся: есть синтаксис, есть способ экранирования контента от этого синтаксиса и способ экранирования символов экранирования, если вдруг такая последовательность встречается в исходной строке. Большинство, но не…

Тег . Парсер HTML внутрь тега не заглядывает, для него это просто какой-то текст, который он потом отдает в парсер Javascript.

В свою очередь, Javascript — это самостоятельный язык с собственным синтаксисом, он, вообще говоря, никаким специальным образом не рассчитан на то, что будет встроен в HTML. В нем, как в любом другом языке, есть строковые литералы, в которых может быть что угодно. И, как вы уже должны были догадаться, может встретиться последовательность символов, означающая закрывающий тег .

Что тут должно происходить: переменной s должна присваиваться безобидная строка.

Что тут происходит на самом деле: Скрипт, в котором объявляется переменная s на самом деле заканчивается так: [var s = «surprise!] , что приводит к ошибке синтаксиса. Весь текст после него интерпретируется как чистый HTML и в него может быть внедрена любая разметка. В данном случае открывается новый тег ни в каком виде. А стандарт Javascript не запрещает такой последовательности быть где угодно в строковых литералах.

Получается парадоксальная ситуация: после встраивания валидного Javascript в валидный документ HTML абсолютно валидными средствами мы можем получить невалидный результат.

На мой взгляд это и является уязвимостью разметки HTML, приводящей к уязвимостям в реальных приложениях.

Как эксплуатируется уязвимость

Конечно, когда вы просто пишете какой-то код, трудно представить, что вы напишете в строке и не заметите проблем. Как минимум, подсветка синтаксиса даст вам знать, что тег закрылся раньше времени, как максимум, написанный вами код не запустится и вы будете долго искать, что произошло. Но это не является основной проблемой с этой уязвимостью. Проблема возникает там, где вы вставляете какой-то контент в Javascript, когда генерируете HTML. Вот частый кусок кода приложений на реакте с серверным рендерингом:

В initialState может появиться в любом месте, где данные поступают от пользователя или из других систем. JSON.stringify не будет менять такие строки при сериализации, потому что они полностью соответствуют формату JSON и Javascript, поэтому они просто попадут на страницу и позволят злоумышленнику выполнить произвольный Javascript в браузере пользователя.

Тут в строки с соответствующим экранированием записываются id пользователя и referer , который пришел на сервер. И, если в user.id вряд ли будет что-то кроме цифр, то в referer злоумышленник может запихнуть что угодно.

Но на закрывающем теге приколы не заканчиваются. Опасность представляет и открывающий тег

Что видит здоровый человек и большинство подсветок синтаксиса в этом коде? Два тега ниже, хе-хе). Если вы до этого не сталкивались с подобным, то можете подумать, что я сейчас шучу. К сожалению, нет. Вот скриншот DOM-дерева примера выше:

Самое неприятное, что в отличие от закрывающего тега , который в Javascript может встретиться только внутри строковых литералов, последовательности символов и

А вы точно спецификация?

Спецификация HTML, помимо того, что запрещает использование легальных последовательностей символов внутри тега «‘; console.log(script.outerHTML); >>> «

Как видите, строка с сериализованным элементом не будет распаршена в элемент, аналогичный исходному. Преобразование DOM-дерево → HTML-текст в общем случает не является однозначным и обратимым. Некоторые DOM-деревья просто нельзя представить в виде исходного HTML-текста.

Как избежать проблем?

Как вы уже поняли, способа безопасно вставить Javascript в HTML нет. Но есть способы сделать Javascript безопасным для вставки в HTML (почувствуйте разницу). Правда для этого нужно быть предельно внимательным всё время, пока вы пишете что-то внутри тега

Точно так же можно экранировать и отдельные строки.

Другой совет — не встраивайте в тег «>

Но, по-хорошему, конечно, если вы хотите нормально разрабатывать приложения, а не аккуратно ходить по минному полю, нужен надежный способ встраивания скриптов в HTML. Поэтому правильным решением считаю вообще отказаться от тега

Код внутри выглядит ужасно и непривычно. Но это код, который попадет в сам HTML. В шаблонизаторе, который вы используете, можно сделать простой фильтр, который будет вставлять тег и экранировать все его содержимое. Вот так может выглядеть код в шаблонизаторе Django:

Источник

Оцените статью