• パラメータに不正な
    値が入っているかチェック(パラメータ改ざんチェック)...
  • rimirimi 
    パラメータに不正な値が入っているかチェック(パラメータ改ざんチェック)の理解がいまいちピンとこないので教えてください。

    今回、26行目で
    if(!is_int($currentPageNum)){
    error_log('エラー発生:指定ページに不正な値が入りました');
    header("Location:index.php"); //トップページへ
    }

    とありますが、今回GETパラメータはc_idとsortだけで、pは付与されていないため、$currentPageNumはint型の1が必ず入るようになるかと思います。

    パラメータ改ざんとは、url部分をユーザー側がいじったりした際に必要になってくると認識しているのですが、そうであればこの処理は意味がないのではと考えました。

    ここまでの認識が間違っていないのであれば、続けて以下の質問をさせてください。

    ①このページでパラメータ改ざんチェックを必要とするのなら、$categoryと$sortの中身をチェックするようになるのかと考え以下のように変更しました。

    if(!is_int((int)$category) || !is_int((int)$sort) ){
    error_log('エラー発生:指定ページに不正な値が入りました');
    header("Location:index.php"); //トップページへ
    }

    通常の場合でも変数の値がstring型なのでintにキャストした上で、is_intで整数チェックかどうかを行うのは分かるのですが、
    これで不正な値を入れられた時にもintにキャストしてしまえば引っかからないので意味がない気がするのですが、これ以上に方法が思いつきません。


    ②そもそも今回のパラメータの改ざんチェックに必要性があるのかもいまいち分からずにいます。
    なぜなら、商品(<div class="panel-list">)をforeachで作成していく際に、$dbProductDataの中身を取り出していますが、getProductList関数で、DBの値と照合しています。
    DBになければ、catchに入りエラーになるので、パラメータをおかしな値に改ざんされても十分なのかと思ってしまいます。

    他の方の質問に目を通したり、GETパラメータ改ざんによる攻撃の種類などについても自分なりに調べるなどして考えたのですが、不十分な気がしてならないのでご教授いただけたらと思います。

    回答 0

    rimi 
    すみません。getパラメータのpはページングの処理で付与されていました。

    そうなると動画内では以下のような処理を書く必要があるということですよね。

    if(!is_int((int)$currentPageNum) ){

    しかしやはり同様な疑問なのですが、
    intにキャストしてしまえばこのチェックの意味は無くなってしまうのではと思います。試しにulrのパラメータをいろいろな文字に変更してみましたが、intにキャストしているためチェックは通りません。

    そこで,以下のように正規表現を使って書き換えてみたところ、数字や数値の形であれば問題なく、その他であればチェックに引っかかってくれます。

    if(!preg_match('/^[0-9]+$/',$currentPageNum)){


    もし考え方に間違いや不備などございましたらご指摘いただけたらと思います。

     
    サンプルコードでは、

    if(!is_int($currentPageNum) ){

    となっており、int型にキャストはしていません。
    よってint型以外が渡ってくると、エラー処理に入るようになっています。

    ご提示された以下の処理でも問題はないですが、可読性を考えるとis_intを使用した処理を使用している場合が多いです。

    if(!preg_match('/^[0-9]+$/',$currentPageNum)){

    rimi 
    5分36秒のところで、

    「誤;int型にキャストしたままで大丈夫です 」

    と表示があったので意味を捉え間違えていたようです。

    可読性のことも教えていただきありがとうございました。
    勉強になりました。