Веб-инспектор безопасности не признает мой перебор кадров эффективным

Я запускаю приложение webinspect для обнаружения угроз безопасности в моем приложении. Одной из обнаруженных угроз была (Cross-Frame Scripting), и я исправил ее, добавив (X-Frame-Options) заголовок (SAMEORIGIN). Теперь, когда я повторно запускаю веб-инспекцию, он все еще обнаруживает (Cross-Frame Scripting), и вместе с ним сообщается следующее сообщение:

При загрузке этой страницы внутри фрейма эффективная техника удаления кадров не наблюдалась

Я использовал много блочного кода, но та же проблема сохраняется. Я попробовал следующие убийцы блоков:

Первая попытка:

 <style> html{display:none;} </style> 
   <script>    
    if(self == top) {
    document.documentElement.style.display = 'block';} 
    else {
    top.location = self.location; } 
</script>

Вторая попытка:

if (top != self) { top.location.replace(self.location.href); }

Третья попытка:

if(top.location!=self.locaton) {
  parent.location = self.location;
}

1 ответ

Определите "эффективный".

Хотя три фрагмента JavaScript, которые вы представили, работают, вы искали способы остановить это?

Например, в iframe (который будет контролировать злоумышленник) добавьте атрибут sandbox с пустым значением:

<iframe src="Inner.html" sandbox="">

документация iframe

Вот пример теста, который я сделал:

Outer.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Outer Html</title>
    </head>
    <body>
        <h1>Outer Html</h1>
        <p>
            Outer Html
        </p>
        <iframe src="Inner.html" width="400" height="300" sandbox="">
            <p>Your browser does not support iframes.</p>
        </iframe>
    </body>
</html>

Inner.html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Inner Html</title>
   <script>    
    if (top != self) { top.location.replace(self.location.href); }
</script>
    </head>
    <body>
        <h1>Inner Html</h1>
        <p>
            Inner Html
        </p>
    </body>
</html>

X-Frame-Options

Если вы используете X-Frame-Options и код JavaScript, чтобы убедиться, что вы не в кадре, почему бы не установить значение DENY вместо SAMEORIGIN?

С SAMEORIGIN Ваша поверхность атаки меньше, она будет успешной только в том случае, если iframe приходит с вашего сайта (возможно с другой уязвимостью). Если вы не собираетесь делать фреймы на своем сайте, вы можете использовать более безопасный вариант X-Frame-Options: DENY,

Я думаю, что именно этого и ожидает HPE Fortify WebInspect.

Директива-фрейм-предки Content Security Policy (CSP)

Другой вариант заключается в использовании frame-ancestors директива со значением "none" в заголовке HTTP "Content-Security-Policy". Это предотвратит (в поддерживаемых браузерах) любой домен от создания контента. Этот параметр рекомендуется, если не определена конкретная потребность в кадрировании.

Большой Ресурс

Вы можете найти больше информации о предотвращении Clickjacking в OWASP.

Другие вопросы по тегам