セキュリティ対策で、フレームワーク等を使用していない場合でも後々を考えて、メインフローとなる部分やクラス内でも生の$_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表示前」に行なわない場合、プログラマーの習慣でエスケープ漏れ、ダブルエスケープが生じる。