忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/08/20 07:36 |
その他1-1:セキュリティ対策1:クロスサイトスクリプティング
現在、あらゆるプログラミング行為で最も重要なのはセキュリティ対策です。
とりあえず以下のプログラムを見てください。
あえて不完全にしてありますが、それでも決してアップロードしないように。

xss.php
<!-- テキストエリアの文字を表示するプログラム -->
<form method="GET" action="./xss.php">
 <input type="text" name="入力">
 <input type="submit">
</form>
<br />

<?php
print($_GET['入力'])
?>


まずform,inputタグで任意のテキストを入力します。
そのテキストの送り先はaction="./xss.php"、つまりこのプログラム自身です。
次にPHPのprint関数で文字を表示します。
説明は別のところでしますが、$_GET[]という変数は、
フォームの入力データのことを示します。

つまり、フォームに入力されたデータをただ単に表示する、それだけのプログラムです。

さてこのプログラム、セキュリティ的に重大な欠点があります。欠陥品です。

入力フォームに具体的データを入れてみましょう。

  「Hello,world」
   ↓
  フォームの下に「Hello,world」と表示されるだけです。

  「<b>Hello,world</b>」
   ↓
  Hello,worldが太字で表示されます。つまり<b>タグがブラウザで解釈されてしまっています。

これを利用すると、いろんな危険行為が可能となってしまいます。

  「<script>alert("Hello,world");</script>」
   ↓
  JavsScriptが実行され、ダイアログボックスが表示されます。

  「入力が認識できませんでした。パスワードを再度入力して下さい。<form method="POST" action="http://www.hogehoge.com/index.cgi"><input type="text" name="入力"><input type="submit"></form>」
   ↓
  うっかりパスワードを入力してしまった場合、パスワードが別のサーバに送信されてしまいます。
  実際はGETの文字数制限の為動きませんが、だからといって危険を残しておいてはいけません。


またこのプログラム、データをGETで送っているので別の問題があります。
GETというのはamazonとかでよく見るURLの後に?○○=××というやつで、
あれでサーバに対して情報を送ることが出来ます。
というわけでxss.phpにアクセスするとき、
 xss.php?入力=Hello,world
とアドレス欄に入力するとHello,worldが表示されます。

というわけで悪意を持った人が
 xss.php?入力=<script>while(1){document.write("Hello,world");}</script>
というアドレスに対してリンクを張ると、
そのリンクを踏んだ人のブラウザが死にます。

以上の話はクロスサイトスクリプティングという有名な脆弱性で、
これの対策が行われていないと話にならない、というレベルです。

まあ回避方法も色々あって、たとえば上記のxss.phpでは
print(htmlspecialchars($_GET['入力']))
と書くだけでほぼ無問題になります。

それどころかライブラリを使用すれば、
一切対策を気にしなくていいなんてものすらあるのですが、
とりあえずプログラムを書く上ではこのような脆弱性の話は
一般常識として知っておかねばなりません。

次回はSQLインジェクションの話でも。

PR


2008/04/14 05:16 | Comments(0) | TrackBack(0) | セキュリティ

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP0-1:これもXSSになるのかなあ? | HOME | PHP1-3:Hello,worldの解説>>
忍者ブログ[PR]