LINUX.ORG.RU

Безопасный доступ к переменной на странице

 , ,


0

1

Допустим, я хочу получить доступ из скрипта greasemonkey к переменной примитивного типа, определенной на странице.

Если я сделаю так:

if (typeof unsafeWindow.var_name === 'number') {
  var n = unsafeWindow.var_name;
 // дальше идет использование переменной n
}

сможет ли злоумышленная веб-страница выполнить код в контексте скрипта greasemonkey? Есть ли тут какая-то лазейка?



Последнее исправление: Klymedy (всего исправлений: 2)

Да пока не вижу лазейки. Может, более опытные коллеги увидят.

Deleted
()

сможет ли злоумышленная веб-страница выполнить код в контексте скрипта greasemonkey? Есть ли тут какая-то лазейка?

вроде-бы нет, но почему ты не хочешь насильно преобразовать переменную в числовой тип?

Вроде-бы Math.ceil() гарантированно даёт number, чем его не корми.

drBatty ★★
()
Ответ на: комментарий от drBatty

Но ведь в вики пишут, что

USE OF UNSAFEWINDOW IS INSECURE, AND IT SHOULD BE AVOIDED WHENEVER POSSIBLE. ... User scripts should therefore avoid calling or in any other way depending on any properties on unsafeWindow

http://wiki.greasespot.net/UnsafeWindow

Даже специальные скрипты написаны, чтобы выполнять передачу значений со страницы асинхронно, путем передачи сообщений:
http://wiki.greasespot.net/Reading_Content_Globals

discordia
() автор топика
Ответ на: комментарий от discordia

Это скорее к тому что не стоит туда лезть без необходимости.

Предусмотри случай что твоей переменной вовсе нет, нормализуй её каким-нибудь parseInt и всё.

Ну или бери тот read_content_global.

Kalashnikov ★★★
()
Последнее исправление: Kalashnikov (всего исправлений: 1)
Ответ на: комментарий от Kalashnikov

Ну или бери тот read_content_global.

В том-то и дело, что для моей задачи оно не годится. Мне надо проверить, не запрещен ли на странице javascript (с помощью NoScript или в настройках браузера). И проверить синхронно, потому что если js запрещен, событие просто не дойдет.

discordia
() автор топика
Ответ на: комментарий от discordia

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

Kalashnikov ★★★
()
Ответ на: комментарий от Kalashnikov

Сюрприз! Даже при включенном NoScript и выключении JavaScript в настройках браузера юзерскрипт greasemonkey будет работать.

discordia
() автор топика
Ответ на: комментарий от Kalashnikov

И да, NoScript по умолчанию.запрещает все скрипты.

discordia
() автор топика
Ответ на: комментарий от discordia

Как-то так:

var js_enabled = false;

var script = document.createElement('script');
script.setAttribute('type', 'application/javascript');
script.textContent = 'var js_enabled = 1;';
document.body.appendChild(script);
document.body.removeChild(script);
if (typeof unsafeWindow.js_enabled === 'number') {
  js_enabled = true;
}

if (js_enabled) {
 // js работает
} else {
 // js запрещен
}

discordia
() автор топика
Ответ на: комментарий от drBatty

вроде-бы нет, но почему ты не хочешь насильно преобразовать переменную в числовой тип?

Ну, в общем-то, просто потому, что мне достаточно наличия переменной. См. код выше.

discordia
() автор топика

В рассылке greasemonkey-users накидали интересных ссылок.
Если вкратце, такой код:

window.__defineGetter__('js_enabled', trap);

function trap() {
  alert('trap');
} 

typeof window.js_enabled;

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

Пичалька.

discordia
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.