マジッククオートなしでユーザーデータをエスケープする
質問
アプリケーションの制御、ストレージ、ロジックなどに使用される前に、外界から来るデータを適切にエスケープする方法を検討しています。
明らかに、マジッククオートディレクティブはphp 5.3.0以降で非推奨になり、php6で削除されたため、レガシーコード(don '私たちはそれを愛しています..)。
しかし、私が見たことのないことの1つは、データを保護した後に何をすべきかについての理論/ベストプラクティスに関する多くの議論です。個人的には、エスケープされたデータをDBに保持することは悪い動きだと思いますが、議論を聞き、できればいくつかのケーススタディを読みたいです。
参照用のPHPマニュアルからのリンク:
PHPマニュアル- mysql_real_escape_string
など。
ヒントはありますか
解決
準備されたステートメントを見てください。 mysqlではこれが非常にうまく機能し、データをデータベースに取り込む安全な形式であることを知っています。パフォーマンス上の利点もいくつかあります。
http://dev.mysql.com/tech -resources / articles / 4.1 / prepared-statements.html
もし興味があればもっとリソースがあります。
これがあなたが探しているものだと思います、tc。
編集:
追加できることの1つは、準備済みステートメントと組み合わせてフィルターを使用することです。たとえば、FILTER_SANITIZE_STRINGを使用して値が文字列かどうかを確認したり、FILTER_SANITIZE_EMAILを使用してメールを送信したりします。
これにより、ある程度のコードが節約され、非常にうまく機能します。後で独自の方法を使用していつでもデータを確認できますが、使用できるフィルターは多数あります。
他のヒント
-
クエリの実行時にデータをエスケープする正しい方法を使用する: mysql_real_escape_string、準備されたクエリなど...
-
データを変更せずにデータベースに保存
-
出力でデータをエスケープする正しい方法を使用します。 htmlspecialcharsなど。
データベースの作業については、パラメーター化されたクエリと準備されたステートメントを確認してください。 PDO および mysqli はそのために役立ちます。
Htmlspecialchars は、HTMLでテキストを表示するための適切なツールですドキュメント。
そして、PHP 5.3について言及したように、フィルター関数にアクセスできます。 ユーザーデータを処理する際に必ず使用する必要があります。
データベースの挿入の解決策は、バインド変数。
一般的に、何かをエスケープしている場合(シェルコマンド、dbコマンドの一部、ユーザー提供のhtmlなど)は、正しい関数呼び出しを使用していないことを示します(たとえば、< exec
の複数引数形式を使用できる場合、またはフレームワークが不足している場合。欠陥のあるフレームワークで作業するための標準的なアプローチは、引用を考えないことに戻ることができるように、それを強化することです。
エスケープのレベルとクォートのレベルについて考えるのは楽しいかもしれませんが、それを本当に楽しんでいるのなら、暇なときにTclで遊んでください。実際の作業では、他の人が使用するライブラリを設計している場合を除き、引用を考えるべきではありません。その場合、適切に引用し、ユーザーが引用を考えないようにします。 (そして、どのような引用を行うか、しないかを正確に正確に文書化する必要があります)
簡単です。すべての受信データは、データベースに挿入する前に mysql_real_escape_string()を実行する必要があります。何かを整数にする必要があることがわかっている場合は、挿入する前に整数に設定するなどしてください。これは単にSQLインジェクションを停止することを忘れないでください。 XSSとデータ検証は異なります。
何かをメールにしたい場合は、データベースに挿入する前にそれを検証する必要があることは明らかです。
htmlentities()はデータをサニタイズします。つまり、データを変更します。生データは常にデータベースに保存する必要があり、そのデータを取得するときは、そのデータをサニタイズする方法を選択してください。
次の関数を&quot; wrapper&quot;として使用したい mysql_real_escape_string()関数の場合。
function someFunction( $value )
{
if ( is_int( $value ) || is_float( $value ) ) {
return $value;
}
return "'" . mysql_real_escape_string( (string) $value ) . "'";
}
値が浮動小数点または整数の場合、 mysql_real_escape_string()。 mysql_real_escape_string()に渡す前に値を文字列にキャストした理由は、文字列ではない可能性があります。
値が文字列ではない例:
http://localhost/test.php?hello [] = test
test.php内で、$ _ GET ['hello']を期待して mysql_real_escape_string()を実行します。こんにちは、文字列です。まあ、人が値を配列に設定しているので、helloは文字列ではないので、実際に通知を行います。