読者です 読者をやめる 読者になる 読者になる

DOM based XSS

DOM based XSS

  • XSS(Cross Site Scripting)脆弱性の中であまり注意を払われていないタイプにDOM Based XSSというものがあります
  • 一般的にXSS脆弱性と聞いて思い浮かべるのは、攻撃者の悪意ある入力データ(JavaScriptなど)がサーバサイドでのエンコードや削除をすり抜けてクライアントにアウトプットされるというもの
  • document.write()やinnerHTMLといった、文字そのままを書き出すメソッドやプロパティを使うと、そこにDOM based XSSが可能になる余地が生まれます
XSSのタイプ
  1. 第1のXSSは悪意ある入力データが直ちに画面に出力されるタイプ
  2. 第2のXSSは悪意ある入力データが(例えば掲示板のように)一旦サーバにデータとして保存された後に画面に出力されるタイプ
  3. 第3のXSSとして言及されているのがDOM Based XSSです。第1、第2のXSSが悪意ある入力データがサーバサイドを経由するという特徴があるのに対して、このDOM Based XSSでは悪意ある入力データが必ずしもサーバサイドを経由する必要がないという特徴を持っています

write()メソッドは使用しないようにする

  • write()メソッドを使用しないで、ブラウザに表示する
textContent
  • 取得した要素の「コンテンツ」を表すプロパティ
Q1
  • p要素の部分に、現在の日時を表示しなさい(デフォルト)
<body>
<p id="choice">ここに日時を表示します</p>
<script>
document.getElementById('choice').textContent = new Date();
</script>
</body>
Q2
  • 1冊2,400円の本の消費税込みの金額をブラウザに表示しなさい
  • document.write()を使用しない
<body>
<p id="output"></p>
<script>
var total = function(price) {
  var tax = 0.08;
  return price + price * tax;
}

document.getElementById('output').textContent = '1冊2400円の本の税込み価格は、' + total(2400) + '円(税込)です。';
</script>
</body>
<body>
<p id="output"></p>
<script>
var price = parseInt( prompt('金額を半角数字で入力してください', '') );
var total = function(price) {
  var tax = 0.08;
  return price + price * tax;
}

document.getElementById('output').textContent = '1冊' + price + '円の本の税込み価格は、' + total(price) + '円(税込)です。';
</script>
</body>
Q3
  • 以下のような表になるように記述しなさい


<table>
<tr>
<th>タイトル</th><th>価格</th><th>在庫</th>
</tr>
<tr>
<td id="title"></td>
<td id="price"></td>
<td id="stock"></td>
</tr>
</table>
<style>
table {
  border: 1px solid #23628f;
border-collapse: collapse;
}
th,td {
padding: 4px 8px;
border: 1px solid #23628f;
  text-align: center;
}
</style>
</head>
<body>
<table>
<tr>
<th>タイトル</th><th>価格</th><th>在庫</th>
</tr>
<tr>
<td id="title"></td>
<td id="price"></td>
<td id="stock"></td>
</tr>
</table>
<script>
var jsbook = { title:'JavaScript', price:2400, stock:3 };

document.getElementById('title').textContent = jsbook.title;
document.getElementById('price').textContent = jsbook.price + '円';
document.getElementById('stock').textContent = jsbook.stock;
</script>
</body>
Q4
  • わかりやすく日時を表示しなさい(年月日と時刻)
<p>最終アクセス日時:<span id="time"></span></p>
<body>
<p>最終アクセス日時:<span id="time"></span></p>
<script>
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth();
var date = now.getDate();
var hour = now.getHours();
var min = now.getMinutes();
var week = [ '日', '月', '火', '水', '木', '金', '土' ];
var day = week[now.getDay()];

var output = year + '年' + (month + 1) + '月' + date + '日' + day + '曜日' + hour + '時' + min + '分';
document.getElementById('time').textContent = output;
</script>
</body>