6

Codeigniter を使用してユーザー入力をサニタイズするためのベスト プラクティスは何かを知りたいです。

CI が set_rules などの form_validation を提供していることを理解しています。

'set_rules'=>'trim|xss_clean|alpha_numeric|htmlspecialchars'

「htmlspecialchars、trim、MD5 など、1 つのパラメーターを受け入れるネイティブ PHP 関数をルールとして使用できます。」

私の質問は今、

xss や sql インジェクション攻撃などから私たちを守るにはこれで十分でしょうか?

他に適用できる規則はありますか?

パフォーマンスの観点から、これらすべてのルールをすべての入力に適用するのはコストがかかりますか?

MD5 がハッシュ関数であることは理解していますが、MD5 をルールの一部として設定するとどうなりますか?

その上で、JavaScript の検証も追加しました。入力のサニタイズとユーザー入力の検証について正しい方向に進んでいますか? ご意見をお聞かせください。

4

2 に答える 2

14

サニタイズは、あらゆる種類のフィルターを通して入力を実行するだけではありません。

入力のサニタイズとは、不要なユーザー データでアプリケーションを汚染しないことです。
しかし、大きな問題は、あなたが望まないものは何ですか?

最初の例

これで、ユーザーがテキスト メッセージを送信できるページが作成されました。想定される入力は、電話番号とテキスト メッセージです。マニュアルのルール リファレンス
を見ると、おそらく次のルールを使用するでしょう。

numeric|exact_length[8]

これらのルールは、入力が数値であり、入力が私の地域の電話番号の長さと一致することを確認したいためです。入力が数値であることは既に検証済みなので、XSS および SQL インジェクションの試行は失敗すると想定できます (これらの攻撃には数値以外の文字が含まれているため)。

テキスト メッセージ フィールドにはtrim|required、空のメッセージを送信したくないので、trim と required: を使用します。

2 番目の例

ユーザーにコメントを許可することは、ユーザーがサイトにスパムを送信したり、悪意のあるコードを挿入したりすることを許可する良い方法です。

基本的に、名前、メール、コメントは必要ありません。

すべての入力が必要です。電子メールは検証する必要があります。ただし、コメントと名前では、XSS とオーバーヘッドのスペース/改行をいくらか整理する必要があります。

サニタジオンによる私の検証は次のようになります。

$this->form_validation->set_rules('name', 'Name', 'required|trim|xss_clean');
$this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
$this->form_validation->set_rules('comment', 'Comment', 'required|trim|xss_clean');

できるものではなく、必要なものをサニタイズし、必要なもののためにサニタジトンを行います。
バックエンドにデータを挿入するときは、Active Record/Query Builderを使用して入力を正しくエスケープするか、同じことを行うクエリ バインディングを使用していることを確認してください。

于 2013-02-07T19:34:00.223 に答える
1

あなたが探しているなら、プライベートな機能、

function sanitizeString($value = ''){

    $value = trim($value);
    if (get_magic_quotes_gpc()) { $value = stripslashes($value); }

    $value = strtr($value,array_flip(get_html_translation_table(HTML_ENTITIES)));
    $value = strip_tags($value);
    $value = mysqli_real_escape_string(get_mysqli(), $value);
    $value = htmlspecialchars($value);

    return $value;
}

function get_mysqli() { 
    $db = (array)get_instance()->db;
    return mysqli_connect('localhost', $db['username'], $db['password'], $db['databse']);
} 

これをカスタム関数として使用して、フォームに渡された各パラメーターをサニタイズします。これに加えて、さらにカスタム関数を追加できることを願っています。常にカスタム関数を持つことは利点であり 、$_GET、$_POST などの配列をさらに単純化するために使用することもできますarray_maparray_walk

于 2015-06-25T13:42:44.273 に答える