О CSRF, что такое CSRF и как это предотвратить?

Node.js внешний интерфейс Безопасность XSS
О CSRF, что такое CSRF и как это предотвратить?

небольшая записка

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

Сначала поговорим об определении CSRF.

Подделка межсайтовых запросов(английский: подделка межсайтовых запросов), также известная какone-click attackилиsession riding, обычно сокращенноCSRFилиXSRF, — это метод атаки, который перехватывает пользователя для выполнения непреднамеренных операций в веб-приложении, вошедшем в систему в данный момент. [1]а такжемежсайтовый скрипт(XSS) по сравнению сXSSИспользуя доверие пользователя к указанному веб-сайту, CSRF использует доверие веб-сайта к веб-браузеру пользователя.

Проще говоря, CSRF должен использовать состояние входа пользователя для инициирования вредоносных запросов.

Представьте csrf через историю

Это пример, который я недавно видел на Zhihu, он очень яркий (поскольку им делятся в WeChat, я не могу сейчас найти ссылку, поэтому просто добавляю содержание истории)

Активирована противоугонная система
Мама: покажи мне одежду
ребенок: хорошо

вот идет вор

нормальная работа:
Ребенок: Кто ты?
Вор: Я Чжан Сан.
Ребенок: Мама, кто-то украл одежду
Мама: Кто?
Ребенок: Чжан Сан
вор пойман

Уязвимость:
Ребенок: Кто ты?
Вор: я просто шучу
Ребенок: Мама, кто-то украл одежду
Мама: Кто?
ребенок: дразнить тебя
мама: ...

csrf позволяет пользователям инициировать запрос, используя свою личность без их ведома.
Вор: Твоя мать сказала тебе купить стиральный порошок

как атаковать

Предполагая наличие интерфейса отправки пользовательских комментариев через Get-запросы, злоумышленник может добавить на фишинговый сайт картинку, а адрес картинки и есть интерфейс комментариев.

<img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000>

Если интерфейс отправляется почтой, это относительно проблематично, и вам нужно использовать форму для отправки интерфейса.

<html>
    <head>
        <script type="text/javascript">
            function steal()
                {
                &emsp; iframe = document.frames["steal"];
                iframe.document.Submit("transfer");
            }
        </script>
    </head>

    <body onload="steal()">
        <iframe name="steal" display="none">
            <form method="POST" name="transfer"&emsp;action="http://www.myBank.com/Transfer.php">
                <input type="hidden" name="toBankId" value="11">
                <input type="hidden" name="money" value="1000">
            </form>
        </iframe>
    </body>
</html>

как защитить

Для предотвращения CSRF можно соблюдать следующие правила:

  1. Запросы Get не изменяют данные
  2. Запретить сторонним сайтам доступ к пользовательским файлам cookie
  3. Интерфейс запроса блокировки стороннего веб-сайта
  4. Запрос сопровождается проверочной информацией, такой как проверочный код или токен.

SameSite

Файлы cookie могут быть установленыSameSiteАтрибуты. Этот атрибут запрещает отправку файлов cookie с междоменными запросами. Этот атрибут может значительно уменьшить атаки CSRF, но в настоящее время этот атрибут совместим не со всеми браузерами.

Проверить реферера

Для запросов, которым необходимо предотвратить CSRF, мы можем проверить, инициирован ли запрос сторонним веб-сайтом, проверив Referer.

Когда запрос получен в фоновом режиме, об источнике запроса можно судить по заголовку запроса Referer в заголовке запроса.

Token

Сервер выдает случайный Токен (алгоритм не может быть сложным), и Токен переносится каждый раз, когда инициируется запрос, и сервер проверяет, действителен ли Токен.

узел может использоватьcsurfПромежуточное ПО для защиты от атак csrf

var cookieParser = require('cookie-parser')
var csrf = require('csurf')
var bodyParser = require('body-parser')
var express = require('express')

// setup route middlewares
var csrfProtection = csrf({ cookie: true })
var parseForm = bodyParser.urlencoded({ extended: false })

// create express app
var app = express()

// parse cookies
// we need this because "cookie" is true in csrfProtection
app.use(cookieParser())

app.get('/form', csrfProtection, function (req, res) {
  // pass the csrfToken to the view
  res.render('send', { csrfToken: req.csrfToken() })
})

app.post('/process', parseForm, csrfProtection, function (req, res) {
  res.send('data is being processed')
})

В представлении шаблона страницы (в зависимости от языка вашего шаблона; стиль руля демонстрируется здесь) установите значение csrfToken равным значению скрытого поля ввода с именем _csrf:

<form action="/process" method="POST">
  <input type="hidden" name="_csrf" value="{{csrfToken}}">
  
  Favorite color: <input type="text" name="favoriteColor">
  <button type="submit">Submit</button>
</form>

Как избежать атак csrf с помощью ajax, внешнего кода
При доступе к защищенным маршрутам через AJAX токен CSRF должен быть передан в запросе. Как правило, это делается с использованием единственного заголовка запроса, так как добавление обычно можно сделать в центральном месте без модификации полезной нагрузки. Токен CSRF получается от Req.csrftoken () вызова на стороне сервера. Этот токен должен быть подвергнут воздействию клиента, обычно, включая его в исходной странице. Одной из возможностей состоит в том, чтобы сохранить его в теге HTML, где значение может быть получено через JavaScript по запросу.

<meta name="csrf-token" content="{{csrfToken}}">

Вот пример использования Fetch API для отправки на маршрут /process с токеном CSRF из тега на странице:

// Read the CSRF token from the <meta> tag
var token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

// Make a request using the Fetch API
fetch('/process',{
    credentials:'same-origin', // includes cookies in the request
    headers:{
        'CSRF-Token': token // is the csrf token as a header
    },
    method:'POST',
    body:{
        data:'data'
    }
})

Генерация и парсинг токена (пример)
  • Процесс генерации: токен=соль-хеш, хеш=хэш-функция (соль+пароль)

  • Процесс расшифровки: const [соль, хеш] = token.split('-'), пересчитать хеш=хеш-функцию(соль+пароль), затем сравнить

Анти-рывок

Используйте HTTPS (HTTPS по-прежнему передает информацию через HTTP, но информация шифруется с помощью протокола TLS.) Вместо HTTP передаваемые данные шифруются, поэтому, когда запрошенная информация перехватывается инструментом захвата пакетов, отправка не может быть изменена. Данные.

Другие знания в области веб-безопасности, которые вам необходимо знать

Защита паролей (посол, симметричное шифрование, асимметричное шифрование и т. д.)

Несмотря на то, что безопасность паролей — это в основном внутренние вопросы, как хороший фронтенд-программист, вы также должны быть знакомы с этими знаниями.

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

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

Шифрование паролей в узле обычно использует криптомодуль, вы можете посмотреть соответствующее введение в одной из моих предыдущих статей.шифрование данных узла

xss-атака


Добавьте немного о xss здесь
Суть xss — html-инъекция, аналогичная sql-инъекции. SQL, HTML и человеческие языки смешаны с инструкциями и данными, и существует риск внедрения (программы идентифицируют инструкции и данные на основе разделителей, тегов, а люди судят на основе контекста, семантики и повседневного опыта).
Например, при регистрации пользователя пользователь вводит «Чжан Сан» и отправляет его, а сервер сгенерирует «

<p>欢迎新用户,张三</p>

"Передано в браузер. Если пользователь вводит

<script>alert('逗你玩')</script>

Сервер будет генерировать

<p>欢迎新用户,<script>alert('逗你玩')</script></p>

Введите содержимое браузера пользователя, которое будет идентифицировано как выполнение инструкции, это инъекция xss;
Основываясь на этом принципе, вор также вводит имя со специальной семантикой, которое распознается другими клиентами как инструкция, таким образом завершая красивую атаку с сохраненным xss-инъекцией.

Для получения более подробной информации о детской обуви xss можно перейти к соответствующей информации, поэтому я не буду здесь вдаваться в подробности.

Эпилог

После того, как друзья напомнили в комментариях, логика написания не была продумана, и были внесены небольшие коррективы.
Большое спасибо за то, что досмотрели до конца, если вам понравилась эта статья, поставьте лайк и поощрите ее.

использованная литература

  1. csurf
  2. Самая сильная карта интервью на поверхности