Как разрешить пользователям писать javascript с безопасностью?

Блоги-провайдеры, такие как Tumblr и Blogger, позволяют пользователям писать сценарии в своих блогах.

Это позволяет пользователям легко добавлять AdSense, Analytics и счетчики в свои блоги.

Как сохранить безопасность и настройку как?

Какие скрипты я должен фильтровать?

Спасибо 🙂

Если каждый блог будет находиться в собственном домене (а не в домене второго уровня, например blogname.myblog.com !), Скорее всего, нет необходимости фильтровать что-либо вообще.

Политика одинакового происхождения запретит сайтам иметь доступ к чему-либо важному (например, файлы cookie сеансов, которые могут быть захвачены, чтобы проникнуть в другие блоги или административные URL-адреса).

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

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

Это сложная проблема, и это действительно зависит от того, насколько вы строги. Один из способов – заставить их писать на новом языке, который вы предварительно обрабатываете в JS, а это означает, что возможны только то, что вы разрешаете, другой способ – попытаться очернить очевидные вещи, чтобы избежать кражи XSS и cookie.

Реальная проблема заключается в том, что вы не можете просто выполнять поиск строк и заменять:

 alert(document.cookie) 

может быть написано

゚ ω ゚ ノ = / `m') ノ ~ ┻━┻ // '∇` / [' ']; o = (゚ ー ゚) = = 3; c = (゚ Θ ゚) = (゚ ー ゚) – (゚ ー ゚); (゚ Д ゚) = (゚ Θ ゚) = (o ^ ^ o) / (o ^ ^ o); (゚ Д ゚) = {゚ Θ ゚: ' ', ゚ ω ゚ ノ: ((゚ ω ゚ノ == 3) + ' ') [゚ Θ ゚], ゚ ー ゚ ノ: (゚ ω ゚ ノ + ' ') [o ^ ^ o – (゚ Θ ゚)], ゚ Д ゚ ノ: ((゚ー ゚ == 3) + ' ') [゚ ー ゚]}; (゚ Д ゚) [゚ Θ ゚] = ((゚ ω ゚ ノ == 3) + ' ') [c ^ ^ o]; (゚ Д ゚) ['c'] = ((゚ Д ゚) + ' ') [(゚ ー ゚) + (゚ ー ゚) – (゚ Θ ゚)]; (゚ Д ゚) ['o'] = ((゚ Д ゚) + ' ') [゚ Θ ゚]; (゚ o ゚) = (゚ Д ゚) ['c'] + (゚ Д ゚) ['o'] + (゚ ω ゚ ノ + ' ') [゚ Θ ゚] + ((゚ ω ゚ ノ = = 3) + ' ') [゚ ー ゚] + ((゚ Д ゚) + ' ') [(゚ ー ゚) + (゚ ー ゚)] + ((゚ ー ゚ == 3) + ' ') [゚ Θ ゚] + ((゚ ー ゚ == 3) + ' ') [(゚ ー ゚) – (゚ Θ ゚)] + (゚ Д ゚) ['c'] + ((゚ Д ゚) + ' ') [(゚ ー ゚) + (゚ ー ゚)] + (゚ Д ゚) ['o'] + ((゚ ー ゚ == 3) + ' ') [゚ Θ ゚]; (゚Д ゚) [' '] = (o ^ ^ o) [゚ o ゚] [゚ o ゚]; (゚ ε ゚) = ((゚ ー ゚ == 3) + ' ') [゚ Θ ゚] + (゚ Д ゚). ゚ Д ゚ ノ + ((゚ Д ゚) + ' ') [(゚ ー ゚) + (゚ ー ゚)] + ((゚ ー ゚ == 3) + ' ') [o ^ ^ o – ゚ Θ ゚] + ((゚ ー ゚ == 3) + ' ') [゚ Θ ゚] + (゚ ω ゚ ノ + ' ') [゚ Θ ゚]; (゚ ー ゚) + = (゚ Θ ゚); (゚ Д ゚) [゚ ε ゚] = '\'; (゚ Д ゚). ゚ Θ ゚ ノ = (゚ Д ゚ + ゚ ー ゚) [o ^ ^ o – (゚ Θ ゚)]; (o ゚ ー ゚ o) = (゚ ω ゚ ノ + ' ') [c ^ ^ o]; (゚ Д ゚) [゚ o ゚] = '\ "'; (゚ Д ゚) [' '] ((゚ Д ゚) [' '] (゚ ε ゚ + (゚ Д゚) [゚ o ゚] + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + (゚ ー ゚) + (゚ Θ ゚) + (゚ Д ゚) [゚ ε ゚] + (゚Θ ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + (゚ ー ゚) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + (゚ ー ゚) + ((゚ー ゚) + (゚ Θ ゚)) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ((o ^ ^ o) + (o ^ ^ o)) + ((o ^ ^ o ) – (゚ Θ ゚)) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ((o ^ ^ o) + (o ^ ^ o)) + (゚ ー ゚) + (゚Д ゚) [゚ ε ゚] + ((゚ ー ゚) + (゚ Θ ゚)) + (c ^ ^ o) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + (゚ ー゚) + (゚ ー ゚) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + ((゚ ー ゚) + (o ^ ^ o)) + (゚ A ゚) [゚ ε ゚] + (゚ Θ ゚) + (゚ ー ゚) + (o ^ ^ o) + (゚ A ゚) [゚ ε ゚] + (゚ Θ ゚) + ((o ^ ^ o) + (o ^ ^ o)) + ((゚ ー ゚) + (゚ Θ ゚)) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ( (゚ ー ゚) + (゚ Θ ゚)) + ((゚ ー ゚) + (゚ Θ ゚)) + (゚ Д ゚) [゚ ε ゚] + (゚ ゚) + (゚ ー ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ((゚ ー ゚) + (゚ Θ)゚)) + ((o ^ ^ o) + (o ^ ^ o)) + (゚ A ゚) [゚ ε ゚] + (゚ Θ ゚) + ((o ^ ^ o) + (o ^ ^ o) )) + (゚ ー ゚) + (゚ Д ゚) [゚ ε ゚] + ((゚ ー ゚) + (゚ Θ ゚)) + ((o ^ ^ o) + (o ^ ^ o)) + (゚ ゚ ゚) + (゚ Θ ゚) + (゚ ー ゚) + (o ^ ^ o) + (゚ A ゚) [゚ ε ゚] + (゚ Θ ゚) + ((゚ー ゚) + (゚ Θ ゚)) + ((゚ ー ゚) + (o ^ ^ o)) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + ((゚ ー ゚) + (o ^ ^ o)) + (゚ Д ゚) [゚ ε ゚] + (゚ Θ ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + (o ^ ^ o) + (゚ A ゚) [゚ ε ゚] + (゚ Θ ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + (゚ Θ ゚) + (゚ Д゚) [゚ ε ゚] + (゚ Θ ゚) + (゚ ー ゚) + ((゚ ー ゚) + (゚ Θ ゚)) + (゚ Д ゚) [゚ ε ゚] + ((゚ ー ゚) ) + (゚ Θ ゚)) + (゚ Θ ゚) + (゚ Д ゚) [゚ o ゚]) (゚ Θ ゚)) (' ');

Глупый пример, но вы можете видеть, как сложно вручную отфильтровать это.

Невозможно фильтровать что-либо, но javascript может создавать независимые контексты. Структура блога выполняет свой (важный) код javascript в контексте и позволяет блогеру выполнять код в другом контексте. Нет никакого способа для этих контекстов добраться друг к другу: блоггер не может писать JS, который конфликтует с фреймворком JS блога или отрицает его или развращает.

Если пользователь добавляет вредоносные js в свою страницу, тогда должен быть какой-то механизм запрета. Я хотел бы больше сосредоточиться на том, чтобы убедиться, что ваши процедуры регистрации, аутентификации и публикации безопасны, чтобы посетители, которые не вошли в систему, не могли вводить теги сценария в тело ничего не подозревающего пользователя.

Если вы позволите авторизованным пользователям помещать js в свои сообщения, вы уже затрудняете свою ситуацию. Если вы хотите разрешить рекламу adsense или google, вы можете упростить свою работу, создав виджет для тех, которые могут быть размещены в контенте, и вы можете проверить код js, вставленный в эти виджеты, против того, что вы ожидаете от AdSense / Analytics /и т.д…

В то время как Rich имеет большое значение в том, что код может быть скрыт до неузнаваемости. Вы можете фильтровать URL-адреса, которые забирают людей за пределы страны, и, возможно, вам может потребоваться, чтобы любые URL-адреса в javascript были либо локальными, либо сообщают CDN Google.