Web アプリケーションのセキュリティについて最初に認識しなければならないことは、外部データを信頼すべきではないということです。外部データには、プログラマによって PHP コードに直接入力されないデータが含まれます。他のソースからのデータ (GET 変数、フォーム POST、データベース、構成ファイル、セッション変数、Cookie など) は、セキュリティを確保するための手順が講じられるまで信頼できません。
たとえば、次のデータ要素は PHP で設定されているため安全であると考えられます。
PHP セキュリティ保護チェックリスト 1. 安全で完璧なコード
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php </span></span></li><li><span>$</span><span class="attribute">myUsername</span><span> = ‘tmyer’; </span></li><li class="alt"><span>$</span><span class="attribute-value">array</span><span class="attribute">arrayUsers</span><span> = array<br />(’tmyer’, ‘tom’, ‘tommy’); </span></li><li><span>define(”GREETING”, ‘hello<br /> there’ . $myUsername); </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
ただし、以下のデータ要素にはすべて欠陥があります。
PHP セキュリティ保護チェックリスト 2. 安全でないコードと欠陥のあるコード
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php </span></span></li><li><span>$</span><span class="attribute">myUsername</span><span> = $_POST[’username’]; <br />//tainted! </span></li><li class="alt"><span>$</span><span class="attribute-value">array</span><span class="attribute">arrayUsers</span><span> = array($my<br />Username, ‘tom’, ‘tommy’); <br />//tainted! </span></li><li><span>define(”GREETING”, ‘hello there’ <br />. $myUsername); //tainted! </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
最初の変数 $myUsername に欠陥があるのはなぜですか?これはフォーム POST から直接取得されるためです。ユーザーはこの入力フィールドに任意の文字列を入力できます。これには、ファイルを駆除したり、以前にアップロードしたファイルを実行したりする悪意のあるコマンドも含まれます。
「A ~ Z の文字のみを受け入れるクライアント側 (Javascript) フォーム検証スクリプトを使用することで、この危険を回避できないのですか?」と疑問に思われるかもしれません。はい、これは常に有益なステップですが、後で説明するように、あらゆるフォームを自分のマシンにダウンロードし、変更して、必要なものを再送信できます。
解決策は簡単です。サニタイズコードは $_POST[’username’] で実行する必要があります。これを行わないと、(配列や定数などで) $myUsername を使用するたびに、これらのオブジェクトが汚染される危険があります。
ユーザー入力をサニタイズする簡単な方法は、正規表現を使用して処理することです。この例では、文字のみが受け入れられることが想定されています。文字列を特定の文字数に制限したり、すべての文字を小文字にすることを要求したりすることも良いアイデアかもしれません。
PHP セキュリティ保護チェックリスト 3. ユーザー入力を安全にする
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span> ?php </span></span></li><li><span>$</span><span class="attribute">myUsername</span><span> = </span><span class="attribute-value">cleanInput</span><span>($_<br />POST[’username’]); //clean! </span></li><li class="alt"><span>$</span><span class="attribute-value">array</span><span class="attribute">arrayUsers</span><span> = array(<br />$myUsername, ‘tom’, ‘tommy’); //clean! </span></li><li><span>define(”GREETING”, ‘hello <br />there’ . $myUsername); //clean! </span></li><li class="alt"><span>function cleanInput($input){ </span></li><li><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">strtolower</span><span>($input); </span></li><li class="alt"><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">preg_replace</span><span>(”/[^a-z]<br />/”, “”, $clean); </span></li><li><span>$</span><span class="attribute">clean</span><span> = </span><span class="attribute-value">substr</span><span>($clean,0,12); </span></li><li class="alt"><span>return $clean; </span></li><li><span>} </span></li><li class="alt"><span class="tag">?></span><span> </span></span></li></ol>
上記は、PHP セキュリティ保護に関連するテクニックの説明です。