web-dev-qa-db-ja.com

XSSやその他の攻撃を回避するために、$ _ GETパラメーターをサニタイズします

コンテンツをテンプレートに埋め込むためのinclude()を含むphpのWebサイトがあります。ロードするページはgetパラメーターで指定されます。パラメーターの最後に「.php」を追加し、そのページを含めます。 XSSやその他のものを避けるためにセキュリティチェックを行う必要があります(データベースがないため、mysqlインジェクションではありません)。私が思いついたのは次のとおりです。

$page = $_GET['page'];

if(!strpos(strtolower($page), 'http') || !strpos($page, '/') ||
    !strpos($page, '\\') || !strpos($page, '..')) {
        //append ".php" to $page and include the page

入力をさらにサニタイズするために他にできることはありますか?

13
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']);

これをサニタイズする最も簡単な方法はおそらくこれです。これは何でも取り、文字、数字、アンダースコア、またはダッシュのみが含まれていることを確認します。

30
Mez

「サニタイズ」しないでください-攻撃は、ソースではなく、データの使用に固有のものです。代わりに、出力するときに値をエスケープします。 PHPでユーザー入力をサニタイズするための最良の方法は何ですか? に対する私の答えも参照してください。

7
troelskn

ソースコードにあるページの明示的なリストを定義し、それを使用して入力を確認します。はい、それはより多くの作業ですが、何が許可され、何が許可されないかが非常に明確になります。例えば:

$AVAILABLE_PAGES = array('home', 'news',  ...);
$AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1);

$page = $_GET['page'];
if (!$AVAILABLE_PAGES[$page]) {
   header("HTTP/1.0 404 Not Found");
   die('Page not found.');
}

include "pages/$page.php";
4