Сегодня возникла задача запустить в вики-странице javascript. Кодить скрипт в самой страничке не рекомендуется, и такая возможность запрещена по умолчанию, потому что вики-страницу может отредактировать кто угодно, а значит и подменить ваш скрипт на любой другой, в том числе и зловредный, тоже сможет кто угодно.
К счастью, в излюбленном мною движке MediaWiki, есть возможность добавить парсеру обработчики своих тегов. Я решил добавить свой тег и реализовал функцию, которая возвращает мне нужный код на javascript. В результате, можно будет использовать только мою функцию, и никакого левого кода выполняться не будет. Но вот незадача: в готовом HTML посередине скрипта у меня оказываются неверные тэги (разрывы строк, преобразованные в <p>, и неожиданно появившийся тэг <pre>), хотя я явно запретил дальнейший парсинг движком вики. Пришлось весь скрипт писать в одну строчку. В коде это выглядит просто ужасно и самое страшное, что если кто-то догадается его отформатировать, то всё запорется.
Час был потерян на то, чтобы понять, почему добавляются лишние теги. Но так ничего и не получилось, оставил как есть.
Теперь о безопасности, передаваемых в качестве параметров в Javascript из wiki. Я сделал обратный счётчик, чтобы считать, сколько осталось времени до нашей свадьбы. Javascript нужен для того, чтобы обновлять его каждую секунду. Вот так выгядит вызов:
{#countdown: 14 | 7 | 2009 }
Обязательно нужно проверять параметры на валидность, что день, месяц и год являются числами в допустимых пределах. Если не сделать такую проверку, то злоумышленник может передать в скрипт свой код, например вот так:
{#countdown: alert(«Вас взломали») | 7 | 2009 }
Получается, что если вместо операнда, написать любое выражение, оно будет обработано интерпретатором. Это очень опасно.