PageSourceSearch

https://tabilmo.com/js/csrf.js?v=1782720695

js tabilmo.com collected 2026-10-09 23:11:01 UTC 2,643 bytes, 69 lines download raw bytes

1/**
2 * CSRF トークン自動付与(発見7)
3 *
4 * 2026-06 セキュリティ監査 発見7 対応。
5 * CSRF Cookie は HttpOnly のため JavaScript から読めない。よってサーバが
6 * <meta name="csrf-token"> / <meta name="csrf-header"> にトークンとヘッダ名を
7 * 出力し(header.php)、本スクリプトがそれを読んで、状態変更リクエスト
8 * (POST/PUT/PATCH/DELETE) に CSRF ヘッダとして自動付与する。
9 *
10 * 全ページ共通(footer)で axios の直後に読み込む。
11 */
12(function (w, d) {
13  'use strict';
14
15  function meta(name) {
16    var el = d.querySelector('meta[name="' + name + '"]');
17    return el ? el.getAttribute('content') : null;
18  }
19
20  var HEADER_NAME = meta('csrf-header') || 'X-CSRF-TOKEN';
21
22  // 最新トークンを返す(同一ページ内で再生成された場合に備え毎回 meta を読む)
23  function getToken() {
24    return meta('csrf-token');
25  }
26
27  function isStateChanging(method) {
28    if (!method) return false;
29    var m = String(method).toUpperCase();
30    return m === 'POST' || m === 'PUT' || m === 'PATCH' || m === 'DELETE';
31  }
32
33  // --- axios(存在する場合)にインターセプターを仕込む ---
34  if (w.axios && w.axios.interceptors && w.axios.interceptors.request) {
35    w.axios.interceptors.request.use(function (config) {
36      if (isStateChanging(config.method)) {
37        var t = getToken();
38        if (t) {
39          config.headers = config.headers || {};
40          config.headers[HEADER_NAME] = t;
41        }
42      }
43      return config;
44    });
45  }
46
47  // --- fetch をラップして同ヘッダを自動付与(同一オリジンの状態変更リクエストのみ) ---
48  if (typeof w.fetch === 'function') {
49    var origFetch = w.fetch.bind(w);
50    w.fetch = function (input, init) {
51      init = init || {};
52      var method = init.method || (typeof input === 'object' && input && input.method) || 'GET';
53      if (isStateChanging(method)) {
54        // 外部オリジンには付与しない(トークン漏えい防止)
55        var url = (typeof input === 'string') ? input : (input && input.url) || '';
56        var sameOrigin = !/^https?:\/\//i.test(url) || url.indexOf(w.location.origin) === 0;
57        if (sameOrigin) {
58          var t = getToken();
59          if (t) {
60            var headers = new Headers(init.headers || (typeof input === 'object' && input && input.headers) || {});
61            if (!headers.has(HEADER_NAME)) headers.set(HEADER_NAME, t);
62            init.headers = headers;
63          }
64        }
65      }
66      return origFetch(input, init);
67    };
68  }
69})(window, document);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.