php - これは良いサニタイズ機能ですか?

原文 php mysql pdo sanitization

いくつかの問題で助けてくれてありがとう。もちろん私は初心者ですが、学習が重要です。

クエリに送信される前に入力を無害化して、安全であることを確認する関数を作成しています。これらは、私の最後のスレッドからのいくつかの質問と、いくつかの新しい質問です。この質問は、入力を無害化して安全に保つことに本当に優れている人々に向けられています。

これは、すべてのクエリを実行する方法です。

$query = $dbh->prepare("SELECT * FROM table WHERE data = ?");
$query ->execute(array($data));


そして、主に「挿入」クエリまたは他のタイプのクエリでは、このようにします。

$query = $dbh->prepare("INSERT INTO table ( data ) VALUES ( :data )";
$query ->execute(array(':data'=>$data));


私は通常、大量のデータを挿入する必要があるクエリにこのメソッドを使用します。私の質問は、どちらの方法でも機能しますか?私が作ったこのサニタイズ機能を持っているので、私は何も縛られていません。

function sanitize($type, $input) { 
if ($type == "email") { $input = filter_var($input, FILTER_SANITIZE_EMAIL); }
if ($type == "int") { $input = filter_var($input, FILTER_SANITIZE_NUMBER_INT); }
if ($type == "float") { $input = filter_var($input, FILTER_SANITIZE_NUMBER_FLOAT); }
if ($type == "string") {
    $input = filter_var($input, FILTER_SANITIZE_STRING);    
    //$input = filter_var($input, FILTER_SANITIZE_ENCODED); 
    $input = filter_var($input, FILTER_SANITIZE_MAGIC_QUOTES);
    $input = filter_var($input, FILTER_SANITIZE_SPECIAL_CHARS); 
    $input = filter_var($input, FILTER_SANITIZE_STRIPPED);
    //$input = filter_var($input, FILTER_SANITIZE_URL); 
}
return $input;


}

私の質問は、これがこのサニタイズ機能を使用する最良の方法ですか?これについてより良い方法はありますか?先ほど言ったように、セキュリティはプロジェクトを作成する上での最大の関心事であり、何か悪いことが起きる危険を冒したくないので、作成しているプロジェクトに進む前にセキュリティを最適化したいです。

そして私の最後の質問は、CSRFトークンを実行する最良の方法は何ですか?私はOWASPを信じているスクリプトを試しましたが、私の友人の何人かはそれがいくつかの脆弱性を持っていると主張したので、それを使いたくありません。再度、感謝します :)
答え
私の質問は、これがこのサニタイズ機能を使用する最良の方法ですか?


これは、サニタイズを実行するための良い方法です。すべての消毒方法は時間とともに改善されます。


これについてより良い方法はありますか?


ユーザー入力を提供しているWebアプリケーションの場合は、UIでユーザーを期待どおりにガイドすることができます(例:(該当する場合はアパート番号を入力します。それ以外の場合は空白のままにします))。

JavaScriptを使用して、特定の動作を強制できます。

データがPHPスクリプトに到着すると、衛生プロセスを超えて、データの長さがXとYの間にあるかどうかも分析します。たとえば、顧客が年齢を入力している場合、年齢が有効な制限内にあることを確認します。

文字列で不快なタグを付けたくない場合は、strip_tagsを使用して削除します。特定の文字のエンコード/デコード/エスケープを実行します-mysqli_real_escape_stringhtmlspecialcharsの使用を検討してください。

さらに、1つのショットで複数の挿入ステートメントが実行されている場合は、ストアドルーチンを使用します。ルーチンに関係なく、トランザクションを使用します。すべてのトランザクションが希望どおりに完了しない限り、ロールバックします。

select * from ...を使用する代わりに、必要な列を選択します。カバリングインデックスがある場合、2〜3列のみが必要な特定の結果が劇的に高速化する可能性があります。

アプリでsystemexecなどを使用している場合は、escapeshellargs / escapeshellcmdを使用すると便利です。

UIに情報を表示するときは、XSSの可能性を低減/排除するために、関連するフィールドがhtmlspecialcharsで表示されていることを確認してください。また、必要に応じてurlencode / json_encodeの使用も検討してください。

CSRF攻撃を防ぐ方法を例とともに示すhttp://www.wikihow.com/Prevent-Cross-Site-Request-Forgery-%28CSRF%29-Attacks-in-PHPを見てください。

あなたの質問へのコメントはすべて考慮すべき良い考えであり、重要なのは-あなたはすでに正しい方向への一歩を踏み出した-あなたにとってとても良いことです!
関連記事

php - ファイルを確実にロックして、ファイルを読み書きするにはどうすればよいですか?

php - ユーザーロールに基づいてメニューオプションを非表示にする。 WPではない

javascript - jQuery-ajax成功後に新しいデータをロードする前にHTMLテーブルをクリアする

php - PHPエラーログにドメイン名を含めることはできますか?

php - htaccessのパーセンテージサインインを許可/読み取る方法

php - PHPセッション変数を設定してもエラーメッセージが表示されない

php - スタイルタグ内でphp関数を使用する方法

php - ループでグループを作成する方法(特定のフィールドが同じテキストの場合)?

php - 1つのパラメーターに基づいてXMLファイルを3つの新しい配列に分割する方法は?

php - ajaxカスタムヘッダーが2回送信される