【JavaScript】Web 보안에 대해

2850 단어 보안
■ CSRF란?
크로스 사이트 요청 포제리 (CSRF)는 웹 응용 프로그램에 존재하는 취약점 또는 취약점을 이용한 공격 방법입니다.
게시판이나 문의 폼 등을 처리하는 웹 어플리케이션이, 본래 거부해야 할 다른 사이트로부터의 리퀘스트를 수신해 처리해 버립니다.

→참고
htps //w w. t 벽 d 미 c로. 코 m / 그럼 _ jp / 세쿠리 ty - 응 텃 겐 세 / 리세 아 rch - 르 포 rts / th 레 아 t - 소 치온 / csrf. HTML

■ CSRF에 대해 참고로 한 사이트





■ CSRF 공격의 예

【1】공격자가 함정을 건 웹사이트를 준비
【2】피해자가 함정 사이트를 열람
【3】함정 사이트를 열람한 피해자의 PC로부터, 피해자가 그 때 액세스 할 생각이 없는 Web 사이트의 게시판 등에 강제적으로 액세스 되고, 코멘트 등이 기입된다
【4】쓰여진 웹사이트의 접속 로그를 조사하면, 피해자의 PC로부터의 액세스 정보(IP 어드레스 등)가 기록되고 있다



■구체적인 대책으로서

「올바른 액세스 순서를 밟고 있어!」라고 증명할 수 있으면 좋다.
그 때문에 HTML의 태그나 쿠키, sessionstrage에 넣은 토큰을 맞대고 가짜 사이트로부터의 진입이 아닌 것을 증명.
올바른 액세스 절차를 거치는 요청에 대한 응답을 반환하여 가짜 사이트의 악성 요청으로부터 자신의 사이트를 보호합니다.
일치하는 인증서와 같은 것이 CSRF 토큰.

■공격을 상정한 대책(CSRF 대책)

CSRF 대책은 POST 처리시에 행한다.

[1] 로그인시 토큰 (난수)을 생성하여 세션에 저장
【2】 post 송신시는 form내에 그 토큰을 넣어, 서버내에서 요구 파라미터의 토큰과, session내의 토큰이 동일한지 어떤지 판단
[3] 동일하다면 요청을 수락합니다.

■코드 테스트의 어제 구현시, 참고로 한 사이트

■여기를 참고로 구현한 코드와 코멘트
【app.js】
//express-sessionモジュールを設定する
app.use(session({
  //暗号化に利用するキーを設定
  secret: 'secret key',
  //毎回セッションを作成しない
  resave: false,
  //未初期化状態のセッションを保存しない
  saveUninitialized: false,
  cookie: {
    //生存期間は3日
    maxAge: 3 * 24 * 60 * 1000,
    //httpsを使用しない
    secure: false
  }
}));

【user.js】
var express = require('express');
var router = express.Router();
var csrf = require('csrf');
var tokens = new csrf();
let db = require('../models/index');

router.get('/login', (req, res, next) => {
  //新規で秘密文字とトークンを生成する
  var secret = tokens.secretSync();
  var token = tokens.create(secret);
 //秘密文字をセッションに保存する
  req.session._csrf = secret;
 //トークンをCookieに保存する
  res.cookie('_csrf', token);
  var data = {
    title:'User/Login',
    form:{name:'',password:''},
    content:'',
  }

  res.render('users/login', data);
});

router.post('/login', (req, res, next) => {
  //秘密文字をセッションから取得する
  var secret = req.session._csrf;
  //トークンをCookieから取得する
  var token = req.cookies._csrf;
  // 取得したtokenをverify(確認)して同じであればpostメソッドを実行する。
  // 確認が完了したtokenは確認した時点で破棄する。
  if(tokens.verify(secret, token) === false)
  {
    throw new Error('Invalid Token');
  }
  //使用済みの秘密文字を削除する
  delete req.session._csrf;
  //使用済みのトークンを削除する
  res.clearCookie('_csrf');

좋은 웹페이지 즐겨찾기