Предотвращение атаки XSS при использовании CreateElement Javascript - PullRequest
2 голосов
/ 14 октября 2010

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

Исходный URL-адрес всегда является относительным URL-адресом (имя нашего хоста жестко закодировано в Javascript и добавляется к относительному URL-адресу), и мы проводим некоторую проверку входного URL-адреса, чтобы убедиться, что он начинается с «index.php», поскольку запросы направляются через эту страницу на нашем сайте. Например, если на сайте клиента был открыт следующий URL:

www.ourpartner.com/home.html?url=index.php%3Fid%3D999

Исходный URL для iframe будет http://www.oursite.com/index.php?id=999. iframe генерируется в Javascript с использованием createElement следующим образом:

...
// We assign the url value from the query string to the variable urlparam

if(! urlparam.match(/^index\.php/i) ) {
    // Error.  Quit.
}
var myiframe = document.createElement('iframe');
myiframe.src = 'http://www.oursite.com/' + urlparam;
document.getElementById('iframe_container').appendChild(myiframe);

Есть ли вероятность, что злоумышленник может внедрить вредоносный URL-адрес в источник iframe? Браузеры, по-видимому, экранируют любые объекты HTML, которые могут появляться в URL, такие как двойные кавычки и левые / правые угловые скобки. Должны ли мы принимать какие-либо дополнительные меры предосторожности с URL-адресом?

Спасибо!

1 Ответ

3 голосов
/ 14 октября 2010

Нет, это нормально.

Когда вы имеете дело со свойствами DOM, такими как .src, разметка не используется. Вы пишете строку непосредственно в строковое свойство. Вам придется беспокоиться только об экранировании HTML, если вы инкапсулируете значения внутри разметки, например, при записи в innerHTML или document.write().

...