Как предотвратить межсайтовый скриптинг с помощью HTML, JavaScript и DOM
Безопасность

Как предотвратить межсайтовый скриптинг с помощью HTML, JavaScript и DOM

Уязвимости межсайтового скриптинга делают ваш сайт открытым для манипуляций злоумышленников. Как же остановить XSS-атаки?

Межсайтовый скриптинг, широко известный как XSS, является одним из самых опасных методов атаки, используемых киберпреступниками, поэтому жизненно важно, чтобы каждый разработчик и исследователь безопасности знал, что это такое и как предотвратить атаки. Итак, как вы можете принять меры против уязвимости XSS? Вы используете HTML, JavaScript или DOM для отображения данных, которые сайт получает от пользователя. Одна или несколько из этих трех различных областей могут работать вместе

Как предотвратить XSS с помощью HTML

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

Представьте, что у вас есть сайт с гостевой книгой. Предположим, что ваши посетители, использующие эту гостевую книгу, могут писать здесь свои имена и сообщения, и их сообщения могут быть открыто просмотрены. Злоумышленник, желающий провести XSS-тест в вашей гостевой книге, воспользуется областью, выделенной вами для написания сообщения. Этот злоумышленник запустит здесь код JavaScript. Например, злоумышленник может использовать код JavaScript вида:

<script>alert('The XSS!')</script>

Для успешного выполнения этого действия злоумышленник должен использовать тег сценария. Если этого не сделать, код JavaScript не сработает. Вы должны закодировать утверждение < так, чтобы пользователи никогда не могли использовать HTML-теги. Это затруднит работу злоумышленника с тегами HTML

Как предотвратить XSS с помощью JavaScript

Логика в HTML действует и в JavaScript. В некоторых приложениях можно распечатать данные, полученные сайтом от пользователя, с помощью кода JavaScript

Рассмотрим эту кодировку:

<p id='print'></p>
<script>
document.getElementById('test').innerHTML = '';
</script>

Представьте, что на сайте используется блок кода, подобный приведенному выше. Разработчик использовал здесь тег ‘p’ под названием ‘print’. Как видно из кода, значение придет от параметра ‘search’, и разработчик хочет показать это входящее значение в теге ‘p’. Разработчик, выполнивший эту операцию, хотел использовать функцию innerHTML в JavaScript

Теперь давайте посмотрим на ситуацию с точки зрения кибератакующего. В этом случае злоумышленник выполнит XSS-тест внутри тега ‘script’. Для этого злоумышленнику не нужно перезапускать тег, так как тег ‘script’ уже используется. Злоумышленник может написать тест примерно так:

filename.php?search=a' alert('The XSS!'); f= '

Этот код будет отображаться на сайте в виде:

document.getElementById('test').innerHTML = ' a' alert('The XSS!'); f=' ';

Эта атака будет успешной. Чтобы лучше понять проблему, давайте рассмотрим еще один пример техники, которую может использовать злоумышленник. Хакер мог применить XSS-тест, например:

filename.php?search=';</script><em>Fatih</em>

Вот как это будет выглядеть при просмотре с веб-сайта:

document.getElementById('test').innerHTML = ' ';</script><em>Fatih</em> ';

Это может показаться немного странным, потому что атакующий закрыл первый тег ‘script’, используя здесь структуру типа ‘/script’. И таким образом, атакующий может перезапустить любой JavaScript и HTML код, который он захочет

Если задуматься над этими двумя разными примерами, то защита от XSS кажется довольно простой. Необходимой мерой предосторожности будет кодирование символов ‘ и ‘, которые вы видите в первом примере. Во втором примере кодируйте символы < и &gt

Как предотвратить XSS с помощью DOM

В этом варианте XSS данные, которые сайт получает от пользователя, могут влиять на свойство элемента DOM. Например, информация о цвете, которую сайт получает от пользователя, может повлиять на цвет фона таблицы или всего фона страницы. Таким образом, пользователь невольно вмешивается в стилевое оформление тела и таблицы. Следующий код является хорошим примером для этого:

<body bgcolor='<?php echo $_GET['color']; ?>'/>

Таким образом, сайт использует параметр ‘color’, полученный от пользователя, непосредственно в свойстве ‘bgcolor’ элемента ‘body’. Что же может сделать злоумышленник в этот момент? Они могут выполнить этот вредоносный код:

filename.php?color=red' onload='alert('The XSS!')

При просмотре с сайта это выглядит следующим образом:

<body bgcolor=' red' onload='alert('The XSS!') '/>

Чтобы этого не произошло, разработчику придется закодировать символ ‘

Однако в JavaScript есть еще один важный элемент, на который следует обратить внимание. В качестве примера можно привести следующий фрагмент кода:

<a href='javascript:alert('The XSS!')'>

Это означает, что можно напрямую запустить некоторый код JavaScript. Одна из лучших профилактических мер – убедиться, что сайт проверяет, являются ли данные, которые он получает от пользователей, реальным URL. Самый простой метод – убедиться, что в соединении присутствуют такие выражения, как ‘HTTP’ и ‘HTTPS’ (защищенная версия HTTP)

Пример функции для предотвращения XSS с помощью PHP

Вы увидели несколько примеров того, как защитить приложение или сайт от XSS-атак. Вы можете использовать фрагменты кода в этой таблице с помощью PHP:

Закодируйте в HTML

htmlspecialchars($str, ENT_COMPAT)

Кодирование в JavaScript и атрибут DOM

htmlspecialchars($str, ENT_NOQUOTES)

Проверка URL

‘/^(((https?)|(//))).*/&#39

Обратите внимание, что это всего лишь примеры, и они будут отличаться в зависимости от используемого вами программного языка

Вы можете создать веб-приложение с помощью PHP и попробовать использовать коды, которые вы видите выше. Если вам интересно, как использовать все эти методы, вы можете почерпнуть некоторые идеи из приведенного ниже блока кода PHP, который должен быть полезен, даже если вы используете другой язык:

<?php
$data = $_GET['data'];

function in_attribute($str){
return htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT will encode the double quote (') character.
}

function in_html($str){
$link = '/^(((https?)|(//))).*/';
if(!preg_match($link, $str))
{
return '/';
}
return $str;
}

$data = in_attribute($data);
$data = in_html($data);
$data = real_url(data);
?>

Защитите свой сайт от XSS и многого другого

XSS – это популярный вектор атак, используемый хакерами. Обычно для проверки на наличие XSS-уязвимости можно использовать значение пути в URL, любое поле на вашем сайте, в которое можно ввести данные (например, формы и поля комментариев). Но, конечно, существует множество различных методов, которые злоумышленники могут использовать для атаки на сайт, особенно если у вас есть сайт, который имеет много пользователей и скрывает их информацию

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий