• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:管理画面の入力フォームをhtml編集可能にする場合)

管理画面の入力フォームをHTML編集可能にする場合の攻撃対策

このQ&Aのポイント
  • 管理画面の入力フォームをHTML編集可能にする際の攻撃対策について考えましょう。クロスサイトスクリプティング(XSS)やSQLインジェクションなどの攻撃を防ぐためには、以下の手法があります。
  • まず、データの入力時に入力値のバリデーションを行うことが重要です。タグや特殊文字などの不正な入力をチェックし、適切な処理を行うことで攻撃を防ぐことができます。
  • さらに、データの表示時にも適切なエスケープ処理を行う必要があります。HTMLエスケープやSQLプレースホルダを使用することで、入力データに含まれる悪意のあるコードを無効化することができます。

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

  • ベストアンサー
回答No.5

>クロスサイトスクリプティングの対策になっていないと思うのですが。。。 本題をすっかり忘れてました、スミマセン。 http://jp2.php.net/strip_tags とりあえず代表的な方法としては、上記関数を使う方法です。 <?php $str = strip_tags($str, "<p><a>"); ?> 第二引数のタグのみ許可されます。 後はシステムの要件次第ではあるんですが、上記URLの下部のユーザ投稿に様々なXSS対策用のサンプルコードもあります。 一度これらを見てみていただき、使えそうなコードを利用してみるのも良いと思います。 後は、XSSではないですが、「<span style="font-size:10000px">あああ</span>」とか、昔の掲示板荒らし、のような手法などに関しては、正規表現でstyleタグを除去するとか、別途対策が必要かもしれません。

mihop
質問者

お礼

回答ありがとうございます。 タグを許可する、という形でやられるのが一般的なのですね。 すごく勉強になりました。 また、何回も親切に対応していただけたのがうれしかったです。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

http://php.benscom.com/manual/ja/info.configuration.php#ini.magic-quotes-gpc もしかするとコレが原因かもしれません。 PHPには、Get/Post/Cookieの値がそれぞれの変数に格納される前に、自動的にエスケープ処理を行う設定があります。 php.iniでその項目を無効にするか、PHPスクリプト上で、変数に格納された値一つ一つを、stripslashes関数でエスケープされた文字を解除する必要があります。 http://php.benscom.com/manual/ja/function.get-magic-quotes-gpc.php こちらのページのユーザ投稿の一番最初の「stripper」関数の投稿が参考になると思います。 流れは、もしget_magic_quotes_gpc関数にてGPCのエスケープを行う設定になっているのが確認されたら、stripslashes関数にて、エスケープを解除する というプログラムです。

mihop
質問者

補足

回答ありがとうございます。 いろいろ調べていただきありがとうございます。 magic_quotes_gpcの設定をOFFにしたら上記の問題は解決できました。 しかし、入力ボックス上ではタグで囲まれた値が表示されていても、実際はそれをhtmlで表示する際に、エスケープされてないものを表示するということですよね? 例えば、<script>alert (○○);</script>というような文字が入力された場合は、実行されてしまうと思うのですが、その場合はエスケープすべきものをエスケープしてないということになるかと思います。 クロスサイトスクリプティングの対策になっていないと思うのですが。。。 私の解釈が間違っていたらごめんなさい。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

http://www.​○○○.jp/'​http://www.​○○○.jp/' 入力したタグの中に全角とか混ざってませんか? 自宅の環境で同様にやってみましたが特に問題なく表示されるようでした。 一度取得したHTMLをブラウザの「ソース表示」などで確認し、テキストエディタなど、HTMLの色分されたり、全半角のスペースなどが記号で表現されるようなもので見てみてはいかがでしょうか。

mihop
質問者

補足

回答ありがとうございます。 タグの中には全角は入っていません。 そちらではちゃんと表示されるのですね。 もう少し調べてみます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

■XSS対策に関して inputタグのvalue要素の囲い文字を「"(ダブルクオート)」としている場合には、 <input type="text" name="hoge" value="<?php echo htmlspecialchars($_POST['hoge'])?>" /> とすればOKです。(textareaでも同様) 実際に、<input type="text" name="hoge" value="&lt;font color='red'&gt;UNKO&lt;/font&gt;" /> とハードコーディングしてから、POST値をそのままechoなどで出力してみてください。エンコードした文字が戻ってタグとして認識されているのが分かると思います。 ■SQLインジェクション対策にかんして OKbokuzyoさんの仰るとおり、プリペアドステートメントを利用するのが良いと思います。 ただ、提示されたURLのようにSQL文として記述するよりは、PDOクラスなどで実装されているprepareメソッドなどを活用されたほうが、今後MySQLをPostgreSQLに変更する際などに以降しやすいと思いますので、PDOクラスの使い方を調べたほうがよさそうです。 尚、標準のmysql関数でエスケープする方法は、下記 <?php $escape_str = mysql_real_escape_string($_POST['hoge']); ?> 尚、POSTされた値とDBの文字エンコードが違う場合には、関数に流し込む前に文字コードを変換しておく必要があります。(これはPDOのPrepareなどでも同様)

mihop
質問者

補足

回答ありがとうございます。 何回もごめんなさい、もう少しだけ教えてもらってもいいですか? ■XSS対策について <input type="text" name="hoge" value="<?php echo htmlspecialchars($_POST['hoge'])?>" />とコーディングし、 実際に表示された入力のボックスに例えば「<b>aaa</b>」と入力したときは、確かにタグを認識して太字になっていましたが、 例えば「<a href='http://www.○○○.jp'>サイトはこちら</a>」などを入力したときは、飛び先が以下のようになっていました。 http://www.○○○.jp/'http://www.○○○.jp/' (○○○は実際のサイトの英数字を入れてあります) 基本的なタグは入れられるようにしたいのですが、どうすればよいかわかりましたら教えていただけますでしょうか。 また、何か私の捉え方が間違っているようでしたらご指摘ください。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • OKbokuzyo
  • ベストアンサー率43% (130/296)
回答No.1

>タグをつけたままDBへ保存するというのはセキュリティとしてはよくないのではと思う タグを付けたままDBへ保存するのが問題なのではなく、 タグとして認識される危険性をはらんだままデータを取り扱うことが問題なのです。 タグとして認識されることを避けるため、 通常「<」や「>」(あとエスケープの関係で「&」も)という文字は エスケープを行いますが、このときエスケープをDB格納前に行うのか あるいはデータの利用前に行うのかはどちらでも良いことです。 >SQLインジェクションなどの攻撃の対策 上記同様にデータのエスケープを行っても良いのですが SQLインジェクションの対策にはプリペアードステートメントを利用することが一般的です。 具体的には下記サイト等を参考にしてください。 http://www.thinkit.co.jp/cert/books/2/3/1/3.htm

mihop
質問者

補足

回答ありがとうございます。 すみません、初歩的な質問かもしれませんが、 ひとつ教えていただけますか。 >タグとして認識されることを避けるため、通常「<」や「>」 >(あとエスケープの関係で「&」も)という文字はエスケープを >行いますが、このときエスケープをDB格納前に行うのか >あるいはデータの利用前に行うのかはどちらでも良いことです。 通常html編集できなくてもよい場合は、データにスクリプトが 埋め込まれていたとしても、エスケープ処理をしていれば、 ソース上では&のついた文字に変換されて出力されるために スクリプトが実行されないと思うのですが、今回は通常のタグと して使用する必要があるので、こういったエスケープ処理は できないのではと思うのですが、それって間違いですか? もしエスケープ処理をしたとしても、出力前にまたタグとして 認識させなければ、通常のテキストとして処理されてしまうの ではないですか? エスケープしないと、スクリプトが入っていたときに実行されて しまうのではと思うのですが、考え方が間違っているのでしょうか。 プリペアードステートメントについては、少し調べてみます。 ありがとうございます。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アクセスフォーム画面でのチェックボックス

    アクセス初心者です。 会社にある既存のアクセスDBを使いデータ処理をしています。 商品を管理するためのDBなんですが、単純に言うと、まずフォーム画面上に何千もの商品名がエクセルのような一覧表になってズラ~っと表示され、その中からひとつを選択するとその商品の詳細情報の画面に移行、そこで情報を管理更新するというDBです。 困っているのは、最初の一覧になってる画面の商品名の横にそれぞれチェックボックスがついているんですが、そのチェックボックスが反応してくれなくなったんです。(クリックしてもチェックマークが入らない) 先ほどまで問題なく使用できていたのですが・・・ただ、大元のDB部分は問題なく動いております。 何千もある商品情報を年1回チェックするんですが、この商品はチェック済、これはまだということが一覧表示の際に確認できるように使っているだけのチェックボックスなので、中身のDBとの関連はないと思われます。 フォームデザインビュー上で、そのチェックボックスをダブルクリックすると表示されるフィールドのプロパティ(というのでしょうか?)のどこかが関連してると思われるのですが、どこかが分かりません・・・ どなたかお願い致します。

  • SQLインジェクションについて質問です

    よくSQLインジェクションの攻撃で、改竄されたWEBページからウイルスを仕込まれた。 等という話を耳にしますが、この攻撃でどうやって改竄するのですか? 私が知ってる範囲だと、この攻撃では入力フォームに必ず条件マッチするようなSQLを入れて 情報を取り出したり、DBの情報を書き換えたり、情報を消したりくらいしか出来ない気がするのですが・・ あと、SQLインジェクションの紹介でよく見る、ログイン画面で「' 1=1;--」みたいな入力は誰でも思いつくと思うのですが、DBの情報を書き換えたり消したりするのって そのDBのカラム名とかが分からないとできないですよね。 攻撃者はこれらを推測して行っているのですか。 それともカラム名とかを知り得る攻撃手法があるのでしょうか。 また、SQLインジェクションとは関係ないのですがXSSという攻撃手法もありますよね。 こっちはクッキー情報を盗まれるのが一番大きな被害とありますが クッキー情報を盗まれると具体的に何がまずいのでしょうか。 サーバー側でクッキーに個人の名前とかメアドとかを入れてる場合があるという事ですか?

  • フォームで入力画面→確認画面に遷移の際、特定のタグが表示されない

    初めて質問させていただきます。 PHPで簡単なフォームを作成しているのですが、 入力画面に特定のhtmlタグ(span、img)を入力した際、 確認画面に上手く情報が引き継がれず、DBにも登録されません。 -------------------------------------- 【例】 <strong>aaaaa</strong> <span style="color:#999900;">aaaaa</span> <a href="aaa.html">aaaaa</a> <img src="./aaa.jpg" alt=""> このように入力したものが確認画面では aaaaa ←太字になっている aaaaa ←単なる文字列 aaaaa ←リンクが貼られている \"aaaaa\" ←画像が表示されない というふうになり、DBにも上記のまま登録されます -------------------------------------- aタグ、strongタグでは上手くいくのですが…。 お分かりになる方いらっしゃれば、どうかご回答お願いいたします。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • gooblog の「管理編集画面」への、、、、、

     gooblog の 無料版を使っています。  今回CSSを使用し、アクセス解析をしたのですが、不思議なことを発見しました。  私の「編集管理画面」へ何度もアクセスしている人がいるのです。 (1) どうやって、入るのでしょう? (2) 誰かが、なんらかの手法で不正にアクセスしているのでしょうか? (3) 「非公開記事」を覗いているのでしょうか?  ちなみに自分自身のアクセスではありません。  サイトを閉じたほうがよいでしょうか?

  • phpでDBの情報を表で表示しそれを直編集

    phpでDBの情報を表で表示しそれを直編集する方法を探しています。 編集後DB更新ありです。 PHPからMySQLのデータを表で出しました。 UIのためエクセル感覚で操作させたく ブラウザに表示された表を直接編集しDB更新をしたいのですが 方法はありますでしょうか? イメージはPHPMYADMINの管理画面でできる直接編集モードです。

    • ベストアンサー
    • PHP
  • (ACCESS)入力フォームについて

    こんにちはmynannです またまた困っているのでよかったらヒントを いただきたいと思い質問させていただきます まずテーブルが二つあり 商品マスタには管理番号(主キー)と価格の二つの項目があります。 もうひとつは販売マスタというのがあり フィールドは管理番号、販売可(チェックボックス) の二つです。 この二つはリレーションシップの関係にあります そしてこの二つを一つにした 販売可商品マスタクエリがあります 商品マスタにはすでに多くのデータがあり それ専用の入力フォームもあります 今販売マスタの入力フォームを作りたいのです どのようなものかといいますと 管理番号を入力すると価格用のテキストボックスに 自動的に入力された管理番号の価格(商品マスタから調べると思うのですが)を表示するようにしたいのです 管理番号[       ]←ここに値を入力 価格[       ]←管理番号が入力されると自動的にでる 販売可 □ ←自分でチェックする イメージはこのような感じです 更新後処理を使うということはなんとなくわかるのですが どのような処理をさせていいかわかりません 助けてください!お願いします!

  • Access2003のフォームのコンボボックスは入力が必須なのでしょうか?

    会員管理のデータベースを作っています。 新規入力画面のフォームに5つのコンボボックスがあります。 広告媒体やコース、担当者を選択するコンボです。 新規入力して、「レコードの保存」「レポートを開く」クエリを組んだボタンで 入力後に顧客名や諸情報の入ったレポートを出しているのですが コンボボックスが1つでも未選択だと、空のレポートが開いてしまいます。 未選択コンボがあっても、where条件で氏名でひぱって、氏名+入っている情報だけでレポートを出したいのですが・・・。 未選択コンボがあると、テーブルには保存できてもレポートには反映されないものなのでしょうか?

  • システムをサーバーにアップロードしても、管理画面へいけなくて困ってます。

    あるパッケージを買い、ファイルをFTPを使ってサーバーへアップし、管理画面へいきたいのですが、下記エラーが出ます。 SQLDatabase() : DB CONNECT ERROR. -> sqlite_open(estate)                              ↑                     DBネームが反映されます。(eatate) パッケージの中のsqlConf.phpのファイルをテキストで開き、 記述内容を入力するよう説明書には書いており、 そこにDBネーム、DBのID、DBのパスワードを入力するようありますが そこが間違っているのでしょうか? コンピューターのことは素人なので このようなことが難しいのかどうかも分かりません。 どうか教えて頂ければ幸いです。

  • gooブログの編集画面が表示されません。

    gooブログにログインした後、ブログ編集画面が左側のメニューしか表示されなくなりました。 そうなった原因はわかっているのですが・・・ 編集メニューのブログ情報をクリックしてブログ情報画面を出しました。そして、ブログのタイトルの所に某サイトのアクセス解析タグを入力して更新したらそうなりました。 もう一度ブログ情報画面にアクセスしてタグを削除しようとしても更新ボタンが表示されないので不可能です。 どうしたら良いのでしょうか? ちなみにブログ情報はタイトル欄のみ表示されています。

  • PHP入力フォームについて

    現在入力フォームを作っています。 流れとしてはDBに入っている会員情報をフォーム上に呼び出して(各inputにはDB内の会員の情報が表示される)各会員が自分の情報を編集できるというフォームです。 ここで質問なのですが、会員の人が自分の入力内容を変更した際に入力漏れがあるとフォーム画面に戻るのですがその際に入力した内容が表示されるのではなくDB内のデータが表示されてしまいます。 これをDB内のデータではなく入力した内容にしたいのですが、どうしたらよろしいでしょうか? ソースは下記になります。 form.php <?php DB呼び出し・・・ $_SESSION['name'] = $row['name']; ・・・ ?> <?php echo $_SESSION['err_name']; ?> <input type="text" name="name" value="<?php echo $_SESSION['name']; ?>" /> confirm.php <?php $name = htmlspecialchars($_REQUEST['name']); if(!strlen($name)) { $_SESSION['err_name'] = '氏名を入力してください。'; $errFlag = true; } else { unset($_SESSION['err_name']); } エラーの時はform.phpに戻る ?> <?php echo $name; ?> としています。 とても省略していますが、お分かりの方がいらっしゃいましたら教えていただけると助かります。

    • 締切済み
    • PHP