#javascript #security
#javascript #Безопасность
Вопрос:
Допустим, у меня есть сгенерированный php файл javasrcipt, содержащий имя пользователя, идентификационный номер и адрес электронной почты, в который в данный момент выполнен вход. Было бы просто document.location.поиск по href не позволяет удаленным сайтам определять текущего вошедшего в систему пользователя?
Будет ли это безопасно?
if(window.document.location.hostname == 'domain.com')
var user = {
name:'me',
id:234243,
email:'email@email.com'
};
else alert('Sorry you may not request this info cross sites.');
Изначально это кажется мне безопасным.
РЕДАКТИРОВАТЬ: изначально я думал, что это очевидно, но я использую файлы cookie для определения текущего пользователя, вошедшего в систему. Я просто пытаюсь предотвратить междоменный доступ к информации о пользователях. Например, если оператор if был удален, вредоносный сайт A мог внедрить файл javascript и получить доступ к информации о пользователях. При добавлении инструкции if пользовательский объект js никогда не должен появляться. Межсайтовый ajax не поддерживается, поэтому вредоносный сайт может попытаться определить пользователя, вошедшего в систему в данный момент, только с помощью вставки javascript.
ПРАВКА 2: Будет ли безопасна проверка моего http_refer с помощью php? Что, если кэширование также включено для клиента? Например, если пользователь посещает мой сайт A, где загружен пользовательский скрипт, а затем позже посещает сайт B, вредоносный сайт, будет ли скрипт кэшироваться, таким образом, минуя необходимость для сервера проверять http_refer пользователя?
Комментарии:
1. зачем нужно помещать информацию о пользователе в javascript? php на стороне сервера и уже защищен. в любом случае, вы можете захотеть использовать https 🙂
2. Я настраиваю приложение ajax в реальном времени, и оно есть для удобства.
3. затем вам просто нужно сгенерировать, повторно получить user_info снова на странице, загруженной ajax. теперь, когда я знаю, что вы будете использовать ajax для передачи пользовательской переменной, это небезопасно.
4. Неясно, какую атаку вы пытаетесь предотвратить. Если это CSRF, то ответ: НЕТ .
5. @Rock Тогда как бы вы посоветовали это исправить?
Ответ №1:
По сути, вы говорите: «вот ключи от банковского хранилища, вот расписание охраны, а вот расписание персонала. Но, эй, если вы не из компании Acme Security, притворись, что я тебе этого не давал «.
«о, конечно, без проблем, давай я просто притворись, что порву эту записку, и поеду арендовать большой грузовик, чтобы вывезти содержимое твоего хранилища с помощью»
Ответ №2:
Вы действительно просто не хотите пробовать что-то подобное. Предположим, я запускаю вредоносный сайт; что мне делать?
<script>
RegExp.prototype.test = function() { return true; };
</script>
<script src="http://yoursite.example.com/dynamicjs.php"></script>
<script>
alert("Look at the data I stole: " user);
</script>
Комментарии:
1. Как бы вы посоветовали связать со скриптом? Есть ли какой-либо обходной путь, чтобы предотвратить это?
2. Я изменил условие на
window.document.location.hostname == 'domain.com'
и рассматриваю возможность проверки http_referrer.3. Проверка ссылки на стороне сервера безопасна. Я бы с подозрением отнесся к чему-либо в JS, хотя я не могу придумать ничего, что могло бы нарушить вашу проверку.
4. Позволит ли кэширование вредоносному сайту обойти проверку ссылки? Например, пользователь посещает мой сайт, кэшируя скрипт, содержащий информацию о пользователях. Затем пользователь посещает вредоносный сайт, который запрашивает скрипт, который уже находится в кэше пользователя, поэтому на мой сервер не будет отправлен ответ с проверкой http_referrer. Должен ли я отключить кэширование для скрипта, содержащего информацию о пользователях, или есть другое решение?
5. Я так не думаю … но на самом деле, самое надежное — просто не включать конфиденциальную информацию в файлы .js. Если вы используете php, вы должны иметь возможность просто на стороне сервера включать скрипт на свои главные страницы.
Ответ №3:
Нет, то, что у вас там есть, не является «безопасным» в том смысле, что оно раскроет эти детали любому, запрашивающему HTML-страницу, содержащую этот JavaScript. Все, что им нужно сделать, это просмотреть текст (включая скрипт), возвращаемый сервером.
К чему это сводится, так это к следующему: либо вы аутентифицировали другой конец к своему удовлетворению, и в этом случае вам не нужна проверка в JavaScript, либо вы этого не сделали, и в этом случае вы вообще не хотите выводить детали в ответ. В этом if
заявлении на стороне клиента нет никакой цели. Попробуйте это: http://jsbin.com/aboze5 Будет указано, что вы не можете запросить данные; затем выполните просмотр источника и обратите внимание, что вы можете видеть данные.
Вместо этого вам нужно проверить источник запроса на стороне сервера и вообще не выводить эти данные в скрипте, если источник запроса не аутентифицирован.
Обновление 1: Ниже вы сказали:
Я специально пытался определить, является ли document.location безопасным.href может быть подделан.
Да, document.location
может быть подделано путем затенения document
символа (хотя вы могли бы это обнаружить, если бы достаточно постарались):
(function() {
var document; // Shadow the symbol
document = {
location: {
href: "http://example.com/foo.html"
}
};
alert("document.location.href = " document.location.href);
})();
Междоменные проверки должны выполняться внутри браузера, ничто на уровне вашего кода JavaScript не может сделать это надежно.
Но это действительно не имеет значения. Даже если это не могло быть подделано, приведенный пример кода не защищает данные. К моменту завершения проверки на стороне клиента данные уже были отправлены клиенту.
Обновление 2: Вы добавили примечание о проверке HTTP_REFERER
заголовка (так в оригинале) (да, он действительно написан с ошибкой). К сожалению, нет, этому нельзя доверять. HTTP_REFERER
может быть подделано, и отдельно это может быть подавлено.
Не по теме: Вы, вероятно, уже делаете это, но: При передаче личных данных, которые вы обещали сохранить в тайне (я не знаю, есть ли у вас, но надеюсь, что так), используйте HTTPS (например, SSL). Но важно помнить, что, хотя HTTPS гарантирует, что данные не могут быть прочитаны при передаче, он ничего не делает для проверки подлинности источника запроса. Например, вы знаете, что диалог безопасен (в пределах разумного и текущей практики), но вы не обязательно знаете, с кем вы разговариваете. Вот где в дело вступает аутентификация.
Комментарии:
1. Но разве вам не нужен доступ к клиентскому компьютеру, который таким образом создает избыток потенциальных угроз безопасности? Я думал, что javascript предотвращает межсайтовый ajax.
2. @Lime: А если кто-то просто запросит этот URL напрямую? Из браузера или сканера / паука? Или через
curl
, илиwget
? Ваш код буквально просто инициализируетuser
объект из объектного литерала или нет, в зависимости от местоположения. Но объектный литерал доступен любому, независимо от того, используете ли вы его для инициализацииuser
или нет.3. У меня настроена система аутентификации php. Он использует файлы cookie для проверки того, вошел ли пользователь в систему. Если кто-то запросит скрипт с помощью
wget
, я бы ответил либо пустой страницей, либо пустымuser
объектом js. В частности, я использую Kohana. Я просто пытаюсь предотвратить междоменный доступ к информации о текущем зарегистрированном пользователе.4. @Lime: Все сводится к следующему: либо вы аутентифицировали другой конец к своему удовлетворению, и в этом случае вам не нужна проверка в JavaScript, либо вы этого не сделали, и в этом случае вы вообще не хотите выводить детали в ответ. В этом
if
заявлении на стороне клиента вообще нет никакой цели. Попробуйте это: jsbin.com/aboze5 Будет сказано, что вы не можете запросить данные; затем выполните просмотр источника.5. Я специально пытался определить, является ли document.location безопасным. href может быть подделан.