説明
ユーザー入力をJavaScriptの eval()、new Function()、または文字列を受け取るブラウザーの setTimeout()・setInterval() にコードとして渡すと、Evalインジェクションが発生します。攻撃者がJavaScriptを挿入し、クロスサイトスクリプティング(XSS)などの被害を引き起こすおそれがあります。
想定される影響
- ページの権限で動く悪意のあるJavaScriptによる、ユーザー情報の窃取やユーザーに代わる操作
- ユーザーの機密情報の外部送信
対処方法
eval、new Function、ブラウザーで文字列を実行するsetTimeout・setIntervalを避け、関数や事前に定義した処理を呼び出してください。- 入力が必要な場合は検証し、許可した値だけを受け付けてください。
- ユーザー入力と実行コードを分離し、必要な業務処理を直接実装してください。
例
変更前
javascript
// 外部入力を含まない固定コード
eval('alert("hi")'); // 固定コード、外部入力なし
// 信頼できない入力
const param = new URLSearchParams(window.location.search).get('cmd');
eval(param); // ユーザーがcmdに悪意のあるコードを指定可能
変更後
javascript
const allowed = ['showMessage', 'log']
const param = new URLSearchParams(window.location.search).get('cmd')
if (allowed.includes(param)) {
if(param === 'showMessage') alert('안녕하세요!')
if(param === 'log') console.log('로그 처리')
} else {
// 許可リストにないコマンドを拒否
console.warn('잘못된 명령입니다.')
}
解説:
- 変更前: 検証していない入力を
evalに渡すと、呼び出し元がコードを挿入して実行できます。 - 変更後: 入力で選べるのは事前に定義した処理だけです。
evalなどの動的実行関数は使用していません。