• ベストアンサー

エラーがでます

php初心者です XANPPで見てみたら、エラーがでました 変数チェックにissetを使っていないと気が付いたのですが そこで下記のようにしたのですが、POSTに何もなかった場合は$idの中身は、何もないですよね? 何も中身がない$idがechoのところで出現してもエラーにならないのですか? if (isset($_POST['id'])){ $id=$_POST['id']; } echo $id; よろしくお願いします

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

配列で不正なパラメータが送信された場合に想定外の処理が行われてしまう例 http://www.hackerschool.jp/hack/take46.php (上記の問題はPOSTを使っていますが、FirefoxのLiveHTTPHeaders等のアドオンを利用することにより突破できます) もちろんこんなコードを書くことは稀ですが、エラーログを保存するようにしている場合、このパラメータの送信を繰り返すだけで大量にエラーログ領域を圧迫する攻撃も成立してしまいますね。

flash0
質問者

お礼

回答ありがとうございます 突破できませんでしたorz ですが、突破できてるひともいるようなので配列ははじくことにします ありがとうございました

その他の回答 (2)

noname#244856
noname#244856
回答No.2

NULLと未定義の違い http://qiita.com/mpyw/items/0a4ea0bc9a695da33f0c 今回のケースでは3項演算子を使って $id = isset($_POST['id']) ? $_POST['id'] : ''; とするのがスマートでしょう。空文字列をNULLに変更しても問題ありませんので、より自然な挙動になる方をチョイスしてください。個人的には「echo $id;」のようにする場合は型変換が起こるのは避けたいと感じるので、空文字列の方がオススメですが。 なお、今回はPOSTなのでそれほど気にしなくてもいいですが、GETの場合は簡単にクエリを配列にすることが出来ます。そのようなケースを想定するならば $id = isset($_GET['id']) && is_string($_GET['id']) ? $_GET['id'] : ''; として、「文字列」ではないもの、つまり「配列」として受け取ったものは受け取っていないとみなすのが正解です。もちろんPOSTでもFirefoxのアドオンを使えば容易に可能なので、POSTの場合にも行っておくのが最善ではありますが。 こういった作業を変数1つ1つに対して行うのがすごく面倒なので、少しでも楽にするために汎用的な関数を利用するという手もあります。私は高頻度で下記の関数を利用していますね。 filter_struct_utf8 http://qiita.com/mpyw/items/c39b9ee695a5c2e74627 ・未定義時の初期化文字列またはNULL値の設定が可能 ・(上記を利用しない場合) 自動トリミングフラグの設定が可能 ・(上記を利用しない場合) 任意の「1次元」配列を許可するように設定可能 ・定義する配列構造のネストに対応 ・UTF-8として不正な文字列は未定義と見なす といったように結構汎用性が高くて使いまわしが利きます。

flash0
質問者

お礼

回答ありがとうございます getで変数で受け取りたいのに配列で不正にgetされた場合どんな不具合がおこるのでしょうか? 不正者のねらいがわかりません

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

>何も中身がない$idがechoのところで出現してもエラーにならないのですか? undefined variables が表示されるかどうかは環境次第です。現行のxamppではエラーメッセージを吐きますが、レンタルサーバなどでは表示しないバージョンが多いかもしれません。 提示されたソースには意味がありません。これだとエラーの種類が変わっただけですね(直接 $_POST['id'] を使えば undefined index になる)。 普通は if (!isset($_POST['id'])) { die('id not posted'); } のように自前でエラー処理するか、三項演算子を使って $id = isset($_POST['id]) ? $_POST['id'] : ""; として、$_POST['id']が存在しないときの初期値を与えます。

flash0
質問者

お礼

回答ありがとうございます 全て初期化するようにしました

関連するQ&A