23

CodeIgniter PHPフレームワークには、リクエストごとに自動的に実行される関数があります。この関数は、特にGET / POST / COOKIE配列キーをフィルタリングし、安全でないと見なされる文字に遭遇した場合にアプリケーションを強制終了します。

悪意のあるユーザーがキーを悪用しようとするのを防ぐために、キーには英数字のテキストとその他のいくつかの項目のみが付けられていることを確認します。

何かのようなもの:

// foreach GET/POST/COOKIE keys as $str...
if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
{
    exit('Disallowed Key Characters.');
}

たとえば、これは、のようなものを誤って投稿し<input name="TE$T">たり、のようなクエリ文字列を持っている場合にトリガーされます?name|first=1

これは常識的なキー名を適用したり、アプリケーションの開発中に間違いを見つけたりするための良い方法であることがわかりますが、理解できません$_POST。たとえば、悪意のあるユーザーがデータ内のキーを「悪用」する可能性があるのはなぜですか。特に(私が推測する)入力は同じように悪用可能であるため、これは実際に何を防いでいますか?

4

5 に答える 5

18

このジャンクはnoobコードでよく見られます。

$_SESSION = $_POST;

めったに知られていない秘密は、それ$_SESSIONが「特別」であり、パイプ文字、、を最上位の配列キーとして処理できないことです|。phpは、shutdown / session_write_close中にセッション変数の保存に失敗し、代わりに配列全体をワイプします。

session_start();

if (!isset($_SESSION['cnt'])) {
    $_SESSION['cnt'] = 0;
}

$_SESSION['cnt']++;

/* prior to php 5.4, it will never increment, because it never successfuly saves
unless you comment line below
*/
$_SESSION['a|b'] = 1;

print_r($_SESSION);

それがCodeIgniterがキーをスクラブする理由だと言っているわけではありませんが、それは多くの「入力キーが悪用される方法」の1つです。

おそらくもっとありそうな理由は、人々が確かに次のようなことをしているからです。

if ($formPostDidntValidate) {
    echo "Please fix the form submission errors and try again\n";
    foreach ($_POST as $key => $value) {
        echo "<p>$key<br>
              <input name='$key' value='$value'></p>";
    }
}

htmlコンテキスト、html属性コンテキスト、さらにはsqlコンテキストのエスケープなど、適切なコンテキスト固有のエスケープを実行せずに要求変数を出力します。

$sql = "select * from myTable where 1=1";
foreach ($_POST as $key => $value) {
    $sql .= " and $key = '$value'";
}

多くの人が値を逃れるのを見てきましたが、sqlやhtmlを構築するときの鍵ではありません。

すべてを逃れなければ、簡単にハッキングされます。スクラブ値はエスケープほど良くはありませんが、何もないよりははるかに優れています。エスケープするタイミングと方法を理解するのに十分な知識を持っていない開発者がどれだけいるかを考えると、自動リクエスト変数スクラブを追加する魅力がわかります。

于 2012-05-11T23:38:44.763 に答える
9

あなたの質問自体が良い点を浮き彫りにします:あなたが何から保護されているのか正確には不明です。しかし、それが対処している可能性のあるいくつかの人気のある項目があります:

しかし、それ以外に、なぜあなたがいつもなぜあなたが一般的にを介して保護したいのかを私は本当に考えることができませんpreg_match("/^[a-z0-9:_\/-]+$/i", $str)

CodeIgniterが非常に広く使用されているため、CodeIgniterがあまりにも広く使用されているため、ユーザーがそのような攻撃に気づいていない可能性があるため、自分たちがまだ考えていないことから保護する必要があるという理由だけで、彼らは過保護になっていると感じています。CodeIgniterの開発者。

于 2012-05-11T22:58:41.130 に答える
4

コンソールで言う私はあなたのフォームのフィールド名をからに変更しname="email"ますname="email\"); DROP TABLE users;

XSS攻撃が成功する可能性は低いですが、コーディングが不十分なPHPに損害を与えるようなものを見ることができます。CIはおそらく、すべての拠点をカバーしようとしているだけなので、可能な限りXSSで保護されていると主張することができます。

于 2012-05-11T22:58:14.127 に答える
3

そのようなチェックは時間の無駄です。とにかく期待するキーにのみアクセスします。何らかの理由ですべての要素を反復処理すると、それらを使用して何をしようとしても、それらを適切にエスケープできる可能性が高くなります。

ただし、平均的な初心者のPHPプログラマーのスキルを見ると(この種のメンバーはフレームワークをまったく使用していない可能性が高いですが)、ある程度意味があります。彼がコードでどのような厄介なことをするのかを知ることはできません。そのようなチェックなしで彼の猫を殺すかもしれません。

同じことが、SQLインジェクション対策として「deletefrom」などを含む投稿を拒否する場合にも当てはまります。これは簡単に誤検知を引き起こす可能性があり、たとえばパラメータ化されたクエリを使用する場合は、とにかく安全です。

于 2012-05-11T22:54:12.583 に答える
2

おそらく、この攻撃を防ごうとしているのでしょう。

この攻撃は、PHPがハッシュ構造を構築して$_POST、処理に任意の時間がかかるキーを作成する方法に関する知識を使用して機能します。

おそらく、もっとありふれたSQLインジェクション攻撃を防ごうとしているだけだと思います。

于 2012-05-11T22:59:32.170 に答える