7

私は通常、この関数を使用して、フォーム入力をデータベースに保存する前にサニタイズします。

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

mysql_real_escape_string今日まで、データベースに保存する前にデータをクリーンアップしているときにのみ使用していたため、データベース接続が必要であることに気づいていませんでした。

お問い合わせフォームでこの機能を使ってみたところ、「サーバーへのリンクを確立できませんでした」というエラーが表示されました。データベースに接続することはできましたが、連絡フォームを介して電子メールに送信される前にデータをサニタイズしようとしているだけなので、必要はありません。

mysqlデータベースに保存されていないデータをサニタイズするための最良の方法は何ですか?このデータはまだサニタイズする必要がありますか?

4

4 に答える 4

15

使用するfilter_var()

http://php.net/manual/en/function.filter-var.php

メールをサニタイズしたい場合のように:

$_POST['email'] =    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

メッセージに

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);

enogthです

于 2010-08-09T05:09:14.943 に答える
1

でデータをサニタイズする目的は、mysql_real_escape_stringSQLインジェクションを回避することです。SQLを使用していない場合は、すでに免疫があります。

男性は子宮頸がんにかかりません。

避ける必要のある特殊文字に適したサニタイズ機能を使用してください。理想的には、害を及ぼさないものを剥がさないでください。

于 2010-08-09T05:10:45.117 に答える
-1

全体の概念は間違っています。この機能は、データベースでも電子メールでも役に立ちません。

mysql_real_escape_stringは何も「サニタイズ」しません。これは単にエスケープ区切り文字であり、他には何もありません。データに区切り文字がある場合に構文エラーを防ぐために、次のようにします。

SELECT * FROM table WHERE name = 'it's me' # error!

データがエスケープされた後、データはになり'it\'s me'、エラーは発生しません。
したがって、この関数はSQLクエリでのみ機能し、データの場合は引用符で囲みます

したがって、引用符を付けずにmysql_real_escape_stringだけを実行しても意味がありません。mysql_real_escape_stringは
a)単独で使用する必要があります。トリムやストリップスラッシュなどは、ここでは何の関係もありません
。b)クエリ文字列を作成する直前で、他の場所では関係ありません
。c)引用符で囲まれるデータのみを使用します。
d)他のすべてのデータには別の消毒方法が必要です

メールについては、プレーンテキストで送信するのでサニタイズは必要ありません。あなたが取らなければならない唯一の予防策は、メールの注入
に対してですが 、大したことではありません。ユーザー入力をメッセージ本文にのみ入力してください。サブジェクト、to、from、またはその他のヘッダーには含まれません。メッセージ本文のみ。そして、あなたは安全です

于 2010-08-09T05:16:53.517 に答える
-1

(私はstackoverflowに慣れていないので、これを間違った方法で行っています/私の答えのスタイルで悪い仕事をしています。遠慮なく私に知らせてください。)

私も同じ問題を扱っているので間違っている場合は訂正してください。ただし、攻撃者がユニコードを使用してこれを回避できるため、filter_varを使用して受け入れられた回答では十分ではないと思います。

例: "Bcc:" (スペースが追加されたため、stackoverflowで正しく表示されます)

これは文字列から削除されず、後で「Bcc:」に置き換えられます。

これが私の解決策ですが、もっと良い方法があるかもしれません。誰かが知っているなら、私はそれを聞きたいです。

    $string = str_replace("&", "(and)", $string);
    $string = str_replace("#", "(num)", $string);
    $string = str_replace(";", "(semi-colon)", $string);
    $string = str_replace(":", "(colon)", $string);
    $string = str_replace("@", "(at)", $string);
    $string = str_replace("\\", "(backslash)", $string);
    $string = filter_var($string, FILTER_SANITIZE_STRING);
于 2013-03-27T20:08:18.963 に答える