Evalインジェクション

Evalインジェクション

説明

ユーザー入力を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 などの動的実行関数は使用していません。

参考資料