ソースを参照

Improve HTML escaping helper (#12562)

The previous method did not escape single quotes which under some
circumstances can lead to XSS vulnerabilites and the fact that it
depends on jQuery is also not ideal. Replace it with a lightweight
module.
tags/v1.12.4
silverwind 3年前
コミット
ee5e5a5093
コミッターのメールアドレスに関連付けられたアカウントが存在しません
3個のファイルの変更13行の追加10行の削除
  1. 5
    0
      package-lock.json
  2. 1
    0
      package.json
  3. 7
    10
      web_src/js/index.js

+ 5
- 0
package-lock.json ファイルの表示

"es6-symbol": "^3.1.1" "es6-symbol": "^3.1.1"
} }
}, },
"escape-goat": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz",
"integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw=="
},
"escape-string-regexp": { "escape-string-regexp": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",

+ 1
- 0
package.json ファイルの表示

"cssnano": "4.1.10", "cssnano": "4.1.10",
"domino": "2.1.5", "domino": "2.1.5",
"dropzone": "5.7.0", "dropzone": "5.7.0",
"escape-goat": "3.0.0",
"fast-glob": "3.2.2", "fast-glob": "3.2.2",
"file-loader": "6.0.0", "file-loader": "6.0.0",
"fomantic-ui": "2.8.4", "fomantic-ui": "2.8.4",

+ 7
- 10
web_src/js/index.js ファイルの表示

import './polyfills.js'; import './polyfills.js';


import Vue from 'vue'; import Vue from 'vue';
import {htmlEscape} from 'escape-goat';
import 'jquery.are-you-sure'; import 'jquery.are-you-sure';
import './vendor/semanticdropdown.js'; import './vendor/semanticdropdown.js';
import {svg} from './utils.js'; import {svg} from './utils.js';


const {AppSubUrl, StaticUrlPrefix, csrf} = window.config; const {AppSubUrl, StaticUrlPrefix, csrf} = window.config;


function htmlEncode(text) {
return jQuery('<div />').text(text).html();
}

let previewFileModes; let previewFileModes;
const commentMDEditors = {}; const commentMDEditors = {};


switch (input_id) { switch (input_id) {
case '#milestone_id': case '#milestone_id':
$list.find('.selected').html(`<a class="item" href=${$(this).data('href')}>${ $list.find('.selected').html(`<a class="item" href=${$(this).data('href')}>${
htmlEncode($(this).text())}</a>`);
htmlEscape($(this).text())}</a>`);
break; break;
case '#assignee_id': case '#assignee_id':
$list.find('.selected').html(`<a class="item" href=${$(this).data('href')}>` + $list.find('.selected').html(`<a class="item" href=${$(this).data('href')}>` +
`<img class="ui avatar image" src=${$(this).data('avatar')}>${ `<img class="ui avatar image" src=${$(this).data('avatar')}>${
htmlEncode($(this).text())}</a>`);
htmlEscape($(this).text())}</a>`);
} }
$(`.ui${select_id}.list .no-select`).addClass('hide'); $(`.ui${select_id}.list .no-select`).addClass('hide');
$(input_id).val($(this).data('id')); $(input_id).val($(this).data('id'));
$.each(response.data, (_i, item) => { $.each(response.data, (_i, item) => {
let title = item.login; let title = item.login;
if (item.full_name && item.full_name.length > 0) { if (item.full_name && item.full_name.length > 0) {
title += ` (${htmlEncode(item.full_name)})`;
title += ` (${htmlEscape(item.full_name)})`;
} }
items.push({ items.push({
title, title,
// Parse the response from the api to work with our dropdown // Parse the response from the api to work with our dropdown
$.each(response.data, (_r, repo) => { $.each(response.data, (_r, repo) => {
filteredResponse.results.push({ filteredResponse.results.push({
name: htmlEncode(repo.full_name),
name: htmlEscape(repo.full_name),
value: repo.id value: repo.id
}); });
}); });
return; return;
} }
filteredResponse.results.push({ filteredResponse.results.push({
name: `#${issue.number} ${htmlEncode(issue.title)
}<div class="text small dont-break-out">${htmlEncode(issue.repository.full_name)}</div>`,
name: `#${issue.number} ${htmlEscape(issue.title)
}<div class="text small dont-break-out">${htmlEscape(issue.repository.full_name)}</div>`,
value: issue.id value: issue.id
}); });
}); });

読み込み中…
キャンセル
保存