PHP+MySQLを使っています。
管理画面から入力した商品情報のデータをDBに保存し、DBから情報を取得してホームページに反映させたいと思っています。
その管理画面の入力フォームで、商品詳細を記述する入力ボックスをhtml編集できるようにする場合(タグをつけて記述できるようにする場合)、クロスサイトスクリプティングやSQLインジェクションなどの攻撃の対策としてどういった手法がありますか。
html編集できない入力ボックスを作るときは、私は、タグを取り除くなどの処理をしてDBに保存しています。タグをつけたままDBへ保存するというのはセキュリティとしてはよくないのではと思う部分があり、みなさんはどうされているのかと思い、質問させていただきました。
よろしくお願いいたします。
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タグを除去するとか、別途対策が必要かもしれません。
回答ありがとうございます。
タグを許可する、という形でやられるのが一般的なのですね。
すごく勉強になりました。
また、何回も親切に対応していただけたのがうれしかったです。
本当にありがとうございました。
No.4
- 回答日時:
もしかするとコレが原因かもしれません。
PHPには、Get/Post/Cookieの値がそれぞれの変数に格納される前に、自動的にエスケープ処理を行う設定があります。
php.iniでその項目を無効にするか、PHPスクリプト上で、変数に格納された値一つ一つを、stripslashes関数でエスケープされた文字を解除する必要があります。
http://php.benscom.com/manual/ja/function.get-ma …
こちらのページのユーザ投稿の一番最初の「stripper」関数の投稿が参考になると思います。
流れは、もしget_magic_quotes_gpc関数にてGPCのエスケープを行う設定になっているのが確認されたら、stripslashes関数にて、エスケープを解除する
というプログラムです。
この回答への補足
回答ありがとうございます。
いろいろ調べていただきありがとうございます。
magic_quotes_gpcの設定をOFFにしたら上記の問題は解決できました。
しかし、入力ボックス上ではタグで囲まれた値が表示されていても、実際はそれをhtmlで表示する際に、エスケープされてないものを表示するということですよね?
例えば、<script>alert (○○);</script>というような文字が入力された場合は、実行されてしまうと思うのですが、その場合はエスケープすべきものをエスケープしてないということになるかと思います。
クロスサイトスクリプティングの対策になっていないと思うのですが。。。
私の解釈が間違っていたらごめんなさい。
よろしくお願いいたします。
No.3
- 回答日時:
>
http://www.○○○.jp/'http://www.○○○.jp/'入力したタグの中に全角とか混ざってませんか?
自宅の環境で同様にやってみましたが特に問題なく表示されるようでした。
一度取得したHTMLをブラウザの「ソース表示」などで確認し、テキストエディタなど、HTMLの色分されたり、全半角のスペースなどが記号で表現されるようなもので見てみてはいかがでしょうか。
No.2
- 回答日時:
■XSS対策に関して
inputタグのvalue要素の囲い文字を「"(ダブルクオート)」としている場合には、
<input type="text" name="hoge" value="<?php echo htmlspecialchars($_POST['hoge'])?>" />
とすればOKです。(textareaでも同様)
実際に、<input type="text" name="hoge" value="<font color='red'>UNKO</font>" />
とハードコーディングしてから、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などでも同様)
この回答への補足
回答ありがとうございます。
何回もごめんなさい、もう少しだけ教えてもらってもいいですか?
■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/'
(○○○は実際のサイトの英数字を入れてあります)
基本的なタグは入れられるようにしたいのですが、どうすればよいかわかりましたら教えていただけますでしょうか。
また、何か私の捉え方が間違っているようでしたらご指摘ください。
よろしくお願いいたします。
No.1
- 回答日時:
>タグをつけたままDBへ保存するというのはセキュリティとしてはよくないのではと思う
タグを付けたままDBへ保存するのが問題なのではなく、
タグとして認識される危険性をはらんだままデータを取り扱うことが問題なのです。
タグとして認識されることを避けるため、
通常「<」や「>」(あとエスケープの関係で「&」も)という文字は
エスケープを行いますが、このときエスケープをDB格納前に行うのか
あるいはデータの利用前に行うのかはどちらでも良いことです。
>SQLインジェクションなどの攻撃の対策
上記同様にデータのエスケープを行っても良いのですが
SQLインジェクションの対策にはプリペアードステートメントを利用することが一般的です。
具体的には下記サイト等を参考にしてください。
http://www.thinkit.co.jp/cert/books/2/3/1/3.htm
この回答への補足
回答ありがとうございます。
すみません、初歩的な質問かもしれませんが、
ひとつ教えていただけますか。
>タグとして認識されることを避けるため、通常「<」や「>」
>(あとエスケープの関係で「&」も)という文字はエスケープを
>行いますが、このときエスケープをDB格納前に行うのか
>あるいはデータの利用前に行うのかはどちらでも良いことです。
通常html編集できなくてもよい場合は、データにスクリプトが
埋め込まれていたとしても、エスケープ処理をしていれば、
ソース上では&のついた文字に変換されて出力されるために
スクリプトが実行されないと思うのですが、今回は通常のタグと
して使用する必要があるので、こういったエスケープ処理は
できないのではと思うのですが、それって間違いですか?
もしエスケープ処理をしたとしても、出力前にまたタグとして
認識させなければ、通常のテキストとして処理されてしまうの
ではないですか?
エスケープしないと、スクリプトが入っていたときに実行されて
しまうのではと思うのですが、考え方が間違っているのでしょうか。
プリペアードステートメントについては、少し調べてみます。
ありがとうございます。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- HTML・CSS HTMLタグのあるCSVファイルを利用する方法 4 2023/03/19 14:41
- PDF PDFのテキストを追加機能 1 2022/06/18 12:45
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
php テーブルが作成できない
-
php でqiitaのサイトにあったフ...
-
SplFileObject を利用したとき...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
phpに関わる所での、form actio...
-
ゆゆにゃ。
-
【初心者】XAMPPのapacheの(恐...
-
プログラミング言語で、使える...
-
こちらはただの直列処理ですか?
-
PHPでこのコード自体に意味は無...
-
PHPとHTML+Xamppの掲示板で画像...
-
phpでPEAR::DBを使っているので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タグにはさまれている文字以外...
-
reuterの記事をbeautiful.soup....
-
URLの連続アクセス
-
htmlのソースからテーブルの値...
-
htmlタグ間の特定文字置換
-
正規表現で複数行に渡る範囲を...
-
変数にHTMLを代入する場合
-
Strutsでリンクを動的に生成したい
-
URLの結合
-
VBSでのhtmlタグ要素名の置換
-
javascriptの正規表現でhtmlか...
-
[php][正規表現]タグ以外を削除...
-
htmlspecialchars関数を使いな...
-
preg_match_allで正規表現
-
phpの正規表現でstyle="●●"を削...
-
firefoxで、特定の文字列を含む...
-
[正規表現][入れ子]ネストされ...
-
管理画面の入力フォームをhtml...
-
Nvuで作成したhtmlをコピペして...
-
csobjというタグについて
おすすめ情報