質問

アプリケーションの制御、ストレージ、ロジックなどに使用される前に、外界から来るデータを適切にエスケープする方法を検討しています。

明らかに、マジッククオートディレクティブはphp 5.3.0以降で非推奨になり、php6で削除されたため、レガシーコード(don '私たちはそれを愛しています..)。

しかし、私が見たことのないことの1つは、データを保護した後に何をすべきかについての理論/ベストプラクティスに関する多くの議論です。個人的には、エスケープされたデータをDBに保持することは悪い動きだと思いますが、議論を聞き、できればいくつかのケーススタディを読みたいです。

参照用のPHPマニュアルからのリンク:

PHPマニュアル- mysql_real_escape_string

PHPマニュアル- htmlspecialchars

など。

ヒントはありますか

役に立ちましたか?

解決

準備されたステートメントを見てください。 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は文字列ではないので、実際に通知を行います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top