небольшая записка
Поскольку текст написан слишком небрежно, друг в области комментариев указал, что некоторый не относящийся к делу контент был удален, чтобы другие не беспокоились и не путали концепцию.
Сначала поговорим об определении 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()
{
  iframe = document.frames["steal"];
iframe.document.Submit("transfer");
}
</script>
</head>
<body onload="steal()">
<iframe name="steal" display="none">
<form method="POST" name="transfer" 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 можно соблюдать следующие правила:
- Запросы Get не изменяют данные
- Запретить сторонним сайтам доступ к пользовательским файлам cookie
- Интерфейс запроса блокировки стороннего веб-сайта
- Запрос сопровождается проверочной информацией, такой как проверочный код или токен.
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 можно перейти к соответствующей информации, поэтому я не буду здесь вдаваться в подробности.
Эпилог
После того, как друзья напомнили в комментариях, логика написания не была продумана, и были внесены небольшие коррективы.
Большое спасибо за то, что досмотрели до конца, если вам понравилась эта статья, поставьте лайк и поощрите ее.