Я буду вставлять контент из удаленных источников в веб-приложение. Источники должны быть ограничены / доверены, но есть еще пара проблем:
Удаленные источники могут
1) быть взломанным и вводить плохие вещи
2) перезаписать объекты в моих глобальных именах
пространство
3) Я мог бы в конечном счете открыть это для пользователей, чтобы ввести их собственный удаленный источник. (Пользователь может не попадать в неприятности, но я все равно могу снизить риск.)
Так что я хочу нейтрализовать любой / весь внедренный контент, чтобы быть в безопасности.
Вот мой план на данный момент:
1) найти и удалить все встроенные обработчики событий
str.replace(/(<[^>]+\bon\w+\s*=\s*["']?)/gi,"$1return;"); // untested
Ex.
<a onclick="doSomethingBad()" ...
станет
<a onclick="return;doSomethingBad()" ...
2) удалить все вхождения этих тегов:
скрипт, встраивание, объект, форма, iframe или апплет
3) найти все вхождения слова script в теге
и замените слово script на html-сущности для него
str.replace(/(<[>+])(script)/gi,toHTMLEntitiesFunc);
позаботится
<a href="javascript: ..."
4) наконец, к любому атрибуту src или href, который не начинается с http, должно быть добавлено доменное имя удаленного источника
Мой вопрос: Я что-то упускаю? Другие вещи, которые я должен определенно делать или не делать?
Редактировать: У меня такое ощущение, что ответы пойдут в пару лагерей.
1) «Не делай этого!» ответ
Хорошо, если кто-то хочет быть на 100% безопасным, ему нужно отключить компьютер.
Это баланс между удобством использования и безопасностью.
Ничто не мешает пользователю просто зайти на сайт напрямую и быть разоблаченным. Если я открою его, то пользователь будет вводить контент на свой страх и риск. Они могут так же легко ввести данный URL в адресную строку, как в моей форме. Так что, если нет особого риска для моего сервера, я в порядке с этими рисками.
2) «Я знаю об общих подвигах, и вы должны учитывать это ...» ответ ... или Вы можете предотвратить другой тип атаки, выполнив это ... или А как насчет этой атаки ...?
Я ищу второй тип, если кто-то не может указать конкретные причины, по которым my будет более опасным, чем то, что пользователь может сделать самостоятельно.