Используйте eval без угрозы XSS - PullRequest
1 голос
/ 10 мая 2011

Я делал (не сейчас, но все же мне интересно об этом) игру с использованием HTML5 и JS, и я хотел, чтобы люди могли вставлять собственные сценарии, но безопасные.

function executeCustomJS(code){
 eval(code);//bad
}

Конечно, этот код очень плохой, потому что если код похож на document.location.href='http://meatspn.com', то результат станет очень ... (...)

Одно решение, которое я нашел, это экранирование (например, eval -> ___eval___) всех ключевых слов и непереключение ключевых слов в белом списке, таких как 'while', 'for', 'if', 'var', ' true ',' false ', ... и' func0 ',' func1 ', ...., которые являются чем-то (например, API) игры и являются безопасными.

Например,

function executeCustomJS(code){
 code = code.replace(/(Keyword RegEx)/g,'___$1___');
 /*unescape keywords in whitelist*/
 eval(code);
}

Я не сделал RegEx и все остальное в комментариях, но это не вопрос.

Давайте предположим, что строки в коде не экранированы, нет функции, которая может быть выполнена путем экранирования строки, и 'eval', 'window', 'document', 'alert', 'location' НЕ находятся в белом списке. Тем не менее, некоторые люди могут выполнять код, подобный while(true){}, они не могут выполнять код, подобный document.location.href='http://meatspn.com'.

Безопасен ли этот метод? Или лучший способ существует или нет?

Ответы [ 3 ]

4 голосов
/ 10 мая 2011

Я рекомендую вам предоставить ограниченный язык сценариев поверх JSON.Поэтому запишите механизм сценариев, который требует от вас создания объекта JSON в качестве кода.

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

может создать какой-то декларативный синтаксис для вашего кода сценария.Например,

{
    "0": {
        "Action": "move",
        "X": 10,
        "Y": -5
    },
    "1": {
        "Action": "emote",
        "type": "dance"
    }
}

Теперь, что такое хороший дизайн для крошечного декларативного языка сценариев - это совершенно другой вопрос.

0 голосов
/ 17 мая 2013

https://developers.google.com/caja/

Caja Compiler - это инструмент для безопасного встраивания сторонних HTML, CSS и JavaScript на ваш сайт. Это обеспечивает богатое взаимодействие между страницей встраивания и встроенными приложениями. Caja использует модель безопасности с объектными возможностями для обеспечения широкого спектра гибких политик безопасности, чтобы ваш веб-сайт мог эффективно контролировать то, что встроенный сторонний код может делать с данными пользователя.

0 голосов
/ 10 мая 2011

Представьте все, что пользователь может пожелать сделать как combinators, например, подъязык

...