- ベストアンサー
SQLインジェクション及びクロスサイトスクリプティング対策について
- SQLインジェクション及びクロスサイトスクリプティング対策についての質問です。現在、PHPとMYSQLの勉強をしており、平でSQL文を発行して表示しています。対策として文字コードはUTF8を使用し、マジッククォートはオフで、データのインサート時にはmysql_real_escape_stringを実行しています。さらにデータの出力時にはhtmlspecialcharsを実行していますが、これらの対策で十分かどうかご意見を頂きたいです。
- 現在、PHPとMYSQLを用いたプログラミングの勉強をしている中で、SQLインジェクション対策とクロスサイトスクリプティング対策について質問があります。平でSQL文を発行して表示している際に、以下の4つの対策を行っています。1. 文字コードはUTF8を使用する。2. マジッククォートはオフで、オンの場合はスクリプト中でstripslashesを実行する。3. データのインサート時にはmysql_real_escape_stringを実行する。4. データの出力時にはhtmlspecialcharsを実行する。これらの対策でSQLインジェクションとクロスサイトスクリプティングは十分に防げているでしょうか。ご意見を頂きたいです。
- PHPとMYSQLの勉強中に、SQLインジェクションとクロスサイトスクリプティングについて疑問が生じましたので質問させて頂きます。平でSQL文を発行して表示している際に、文字コードをUTF8に設定し、マジッククォートをオフにし、データのインサート時にはmysql_real_escape_stringを使用し、データの出力時にはhtmlspecialcharsを使用するという4つの対策を行っていますが、これで十分な対策となるのでしょうか。ご意見をお聞かせください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>1. 文字コードはUTF8を使用 これはよいと思います。他の対策が楽。MySQL側にも適切にUTF8を設定すると言うことですよね。 >2. マジッククォートは基本的にオフ。オンの場合はスクリプト中でstripslashesを実行 オンにする必要があるのでしょうか? >3. 2のマジッククォート対策のあとにデータのインサート時に全ての挿入文字列に PlaceHolderは使わないという前提でしょうか。インサートというのがSQLのINSERTという意味なら不十分です。SQLに埋め込むすべての変数・式の値に対してすべき。例えば比較対象文字列とか。インサートというのが、SQLに埋め込むという意味なら、それでよいと思います。 >4. データの出力時にhtmlspecialcharsを実行 ENT_QUOTESを必要な部分で使うというのも。 3と4をもれなくやっていれば大丈夫と思いますよ。 わざとXSS脆弱性が作り込んであって、破る練習?のサイトがあります。これをやると守るスキルが上がると思います。私は11まで行きました。2-3くらいまでは楽勝でしょう。 http://xss-quiz.int21h.jp/
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10361)
#1です。回答ボタンを押した後で、UTF8の冗長なコードの話を思い出しました。 下記などを参考にしてください。 http://gihyo.jp/admin/serial/01/charcode/0004
お礼
「本当は怖い文字コードの話」第1回~第10回まで全て目を通してみました。 Windows上で再現可能な現象なども紹介されていたので、文字コードがどのようなものか良く理解出来ていない私でも文字コードが及ぼす影響について知る事が出来ました。 重ねてありがとうございますm(_ _)m
- notnot
- ベストアンサー率47% (4900/10361)
#1です。回答ボタンを押した後で、UTF8の冗長なコードの話を思い出しました。 下記などを参考にしてください。 http://gihyo.jp/admin/serial/01/charcode/0004
お礼
notnot様ありがとうございます。 #1のお礼を投稿後にこちらの記事に気づきました。 「本当は怖い文字コードの話」参考にさせて頂きますm(_ _)m
お礼
お返事ありがとうございます。 >MySQL側にも適切にUTF8を設定すると言うことですよね。 自信が無いのでレス後、文字コードについて調べてみます。 >オンにする必要があるのでしょうか? 勉強中のため、オン状態でどのような処理をすべきか試す時にオンにしたのですが、現在はオフにしています。マニュアルを見るとPHP6ではこの機能無くなってしまうようですね。 >PlaceHolderは使わないという前提でしょうか。 はい、プレースホルダやPEARなど様々なサイトで見かけ便利そうだとは思っているのですが、今は使わずに現在勉強中のSQLをそのまま書く形での方法を試しております。 >インサートというのが、SQLに埋め込むという意味なら、それでよいと思います。 仰る通り、SQL文に組み込む変数や文字列に対してです。 >ENT_QUOTESを必要な部分で使うというのも。 気をつけます。 知識ほぼ0の段階からのスタートで、まだプログラミングと言うものに対して理解が浅く、正直な所を申しますと自分自身「何がわからないのかがわからない」という段階です。 上述した文字コードについても何故UTF8が良いのか、それも分からない状態なので、単純にソースコードをUTF8で書いていれば良いのだと思っていました。 丁寧なお返事とツッコミを頂いた事で ・「何故UTF8が良いのか」を理解出来ていないので、文字コードについての理解を深める必要がある ・MYSQL側の文字コードについて調べる ・クロスサイトスクリプティングがどのようなものかを理解し、自分自身で再現出来るようにする という課題ができ、「何を知る必要があるのか」がわかりました。 ありがとうございますm(_ _)m