web-dev-qa-db-ja.com

PHP mail()ヘッダー挿入防止

これは サイト が問題をうまく説明しています。基本的に、指定されたほとんどすべてのphp mail()の例は、ヘッダーインジェクション攻撃に対して脆弱です。参照先のサイトは正規表現の衛生ソリューションを提供しますが、私はそれに満足していません。ヘッダーの衛生機能が組み込まれていますか?この種の攻撃から実際に保護するには、何をする必要がありますか?

9
colithium

実際のところ、PHPには、提供されたアドレスの有効性をチェックする機能が含まれています。

http://php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/filter.filters.validate.php

例:filter_var($ _ POST ['from']、FILTER_VALIDATE_EMAIL)? send():die( "あなたは私を殺害しました。D:");

これが pear がMailパッケージでそれを行う方法です:

function _sanitizeHeaders(&$headers)
{
    foreach ($headers as $key => $value) {
        $headers[$key] =
            preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i',
                         null, $value);
    }
}

明らかに、このメソッドを組み込みのmail()関数で動作するように適合させるには、いくつかの作業を行う必要があります。ヘッダーの連想配列を操作する代わりに、mail()関数は文字列を受け入れます。したがって、ヘッダー文字列を作成するとき、あなた(mail()のユーザー)は上記と同様にヘッダーの各部分をサニタイズする必要があります。

これが実際にすべてのインジェクションの脅威をカバーするかどうか(このような問題でより経験豊富な脅威からのもの)であれば、コメントで教えてください。

2
colithium

明らかに、ユーザーからのデータを信頼することはできません。解決策は、ヘッダー関数の便利なサニタイズに依存するのではなく、ユーザーからのDIRTYデータを信頼しないことです。

いつどのように関係なく、データが外部から来ている場合は、それをクリーンアップする必要があります。この例では、単純な/は/ n文字をエスケープし、攻撃は機能しません。

1
Chris Dale