LoginSignup
13
13

More than 5 years have passed since last update.

後の事を考えて $_POSTなどを生で使わないようにする。

Last updated at Posted at 2016-01-05

セキュリティ対策で、フレームワーク等を使用していない場合でも後々を考えて、メインフローとなる部分やクラス内でも生の$_POSTを使わないようにする。
考えてみれば簡単な話しだが、今までこれを考え付かなかったのは、自分の頭の固さか・・・

O_Post.php

<?php


function U_POST($value,$op=0){

    //01- $opで動作切り替えたり、バリデーション入れたりでも。
    if($op==1):
    $val = @$_POST[$value];
    else:
    //
    endif;


    //02- 不要なタグの除去・簡易的なXSS対策
    $val = htmlspecialchars($val, ENT_QUOTES);

    //03- 値を返す
    return $val;

}



//$_POST['test']を取得する
$test = U_POST('test',0);
//echo $test;



もちろんこれだけではダメですが・・・

参考: PHP開発エンジニア必読!最低限必要なセキュリティ対策


(追記:修正)

コメ1:mpyw 様の指摘からの修正

U_post.php
<?php
// 全ての PHP エラーを表示する
//ini_set('error_reporting', E_ALL);



function U_POST($value,$op1=1,$op2=0){

    //01- $op1で動作切り替えたり、バリデーション入れたりでも。
    if($op1==1):
        $val = isset($_POST[$value]) ? $_POST[$value] : false ;
        $val = is_string($val) ? $val : false ;
        //filter_inputに変更も
        //http://php.net/manual/ja/function.filter-input.php
        //PHP7なら&&でも
    else:
    //
    endif;



    //02- $op2で不要なタグの除去・簡易的なXSS対策
    //エスケープ漏れ、ダブルエスケープが生じる可能性がある為、非推奨
    if($op2==1):    
    $val = htmlspecialchars($val, ENT_QUOTES);
    else:
    //
    endif;




    //03- 値を返す
    return $val;

}

?>

<?php
// ----------------------------------------------------------
//以下テスト
//04- $_POST['test']を取得する
    //04-1 生POSTの状態
    //htmlとして解釈される為、Bタグが有効に
    echo $_POST["test"] . "<br>";
    echo $test = U_POST("test",1,0) . "<br>";

    //04-2 エスケープ処理、そのままプレーンな<b>futoi</b>が表示される
    echo $test = U_POST("test",1,1) . "<br>";

    //04-2-2 ダブルエスケープした場合・・・ トホホになる
    echo $test = htmlspecialchars(U_POST("test",1,1)) . "<br>";


//05- formから送信
//値を変えてテストも
//case
// "0"の場合
// "" つまり空の場合
// <b></b> 中身が無いタグの場合
?>
<form method="post" action="">
<input type="text" name="test" value="testdesu<b>futoi</b>">
<input type="submit" name="submit" value="post!">
</form>

考え方の整理として

1 どんな返り値を期待してPOSTの値を処理しているか?
特に一度得た値のnull,false,0,空タグをゴッチャにしてないか?

2 セキュリティ対策の肝は「html表示前」、「SQL発行前」がポイント
でないと「html表示前」に行なわない場合、プログラマーの習慣でエスケープ漏れ、ダブルエスケープが生じる。

13
13
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
13