質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

2回答

4959閲覧

PHPによるデータ取得の無害化と正規表現チェック

1nakaji

総合スコア187

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2015/09/23 02:38

PHPによるWebアプリケーション開発で
POSTやGETで送られたデータの処理方法についてです。

POSTやGETで送られたデータをPHPで受け取って処理をするときに、
$email = htmlspecialchars($_POST['email'], ENT_QUOTES);
というように無害化してデータ取得するようにしています。

例えば、上記がメールアドレスを受け取る変数だとした場合、
これに正規表現などでメールアドレス形式かをチェックもしてから、
データを受け取るということをするのでしょうか。

基本的に要望や仕様次第といえばそうなんでしょうが、
外部からの開発依頼の際にはそこまでの指定はないことも多いです。

その場合は、無害化すればOKと考えるのか、
それにプラスして正規表現によるチェックまで行うか、
また別に考えるべきことがあるのかなど、
ご意見を伺えればと思います。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

POSTやGETで送られたデータをPHPで受け取って処理をするときに、
$email = htmlspecialchars($_POST['email'], ENT_QUOTES);
というように無害化してデータ取得するようにしています。

今の御時世「無害化」という言葉は使われません、「エスケープ」の方が一般的です。
また、htmlspecialcharsデータを受け取って処理するとき ではなく、データを表示するとき にする必要があります。

したがって、

例えば、上記がメールアドレスを受け取る変数だとした場合、
これに正規表現などでメールアドレス形式かをチェックもしてから、
データを受け取るということをするのでしょうか。

データを受け取るときは htmlspecialchars などせず受け取って、そのまま正規表現なりなんなりでチェックした後、データを表示するとき(=HTMLに変数の値を埋め込むとき)に htmlspecialchars でエスケープします。

その場合は、無害化すればOKと考えるのか、

前述の通り htmlspecialchars することを「無害化」と呼ぶべきではありません。
htmlspecialchars は文字列を HTML へ埋め込める形式へ変換する関数であって、それ以上のものではありません。

それにプラスして正規表現によるチェックまで行うか、

正規表現によるチェックは入力値の妥当性を検証するものであって、いわゆるバリデーションです。
htmlspecialchars での、いわゆるエスケープとは全く異なるものなので、同列に考えるべきではありません。

投稿2015/09/23 03:08

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1nakaji

2015/09/23 13:56

ご回答ありがとうございます。 以前読んだ本にデータを受け取るときにhtmlspecialcharsを使うと書いてありましたが、 これが間違っていたんですね。 いい勉強ができました。 ありがとうございます。
guest

0

htmlspecialcharsは表示加工用のメソッドなので、
変数代入時には使用しないです。

基本的な処理の流れとしては、
0. リクエストパラメータを受け取る。
0. リクエストパラメータの入力内容チェックする。(DB更新時のみ)
0. リクエストパラメータの入力内容とDBの整合性チェックする。(DB更新時のみ)
0. DB操作を行う。
0. 結果を表示加工して出力する。
となるかと思います。
無害化対策は、
DB更新時に、SQLインジェクション対策をしっかり取る
表示加工時に、XSS(クロスサイトスクリプティング)対策を取る
です。
もっと、堅牢にしたければ、CSRF対策を検討するのもいいかも。(私はやったことないですが)

投稿2015/09/23 02:59

TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1nakaji

2015/09/23 14:01

ご回答ありがとうございます。 結局はSQLインジェクション対策と XSS対策のことを聞きたかったのですが、 いろいろ調べてみました。 SQLインジェクション対策では、 (1) リテラル部分ではプレースホルダを使用する (2) リテラル以外の部分はホワイトリストで検証する XSS対策では、 echo時などにhtmlspecialcharsを使用する というのが基本的な対策というところに落ち着きました。 これですべて対策できるはずもないですが、 やらないよりはやる方が100倍マシと思いますので、 やるようにします。 いい勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問