mysql_real_escape_stringのなしのサニタイズお問い合わせフォーム
-
26-09-2019 - |
質問
私は通常私のデータベースにそれらを格納する前に、私のフォーム入力をサニタイズするために、この機能を使用します:
//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データベースに格納されていないと、このデータがまだ消毒する必要がないサニタイズデータへの最善の方法は何ですか?
解決
使用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
他のヒント
mysql_real_escape_string
でデータを消毒する目的は、SQLインジェクションを避けるためです。あなたは、SQLを使用していない場合、あなたはすでに免疫です。
男性は子宮頸がんを得ることはありません。
あなたは避ける必要が特殊文字にサニタイズ機能を適切に使用します。理想的には、危害発生しません何かを削除しません。
全体のコンセプトは間違っています。 この機能は、電子メールのためではないとしても、データベースのためではありません助けにはなりません。
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)のみ。トリムまたはにstripslashesのようなものがここには何の関係もありません
b)は右のクエリ文字列の前に他の場所で構成していない
C)のみ引用符で囲むことになるだろうというデータを持つ。
D)他のすべてのデータがサニタイズの別の方法を必要とする
は、電子メールのためとして、あなたはそれはあなたがプレーンテキストとして、それを送信するすべての消毒を必要としません。
あなたが取る必要がある唯一の予防策は、をメール注入の
に反しています
わけではない大したこと。ただ、メッセージ本文のみにユーザーの入力を置きます。ていない被験体へ、またはから、または任意の他のヘッダ。メッセージ本文のみ。そして、あなたが安全である
(私は私は私に知らせて自由に私の答え感のスタイリングと悪い仕事をして/これについて間違った道を進んだので、StackOverflowのために新たなんだ。)
私も今、同じ問題を扱っていますが、私はにfilter_varを使用して受け入れられた答えは、攻撃者がこの使用してユニコードバイパス可能性としては十分であるとは思わないと。私が間違っている場合は、正しい私
例: "Bcc:" (stackoverflowのは正しく表示されますので、追加のスペース)
これは、文字列から削除されませんでした、と後に「のBcc:」に置き換えられます。
これが私の解決策ですが、良い方法があるかもしれません。誰もが1を知っているならば、私はそれを聞いてみたい。
$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);