2011-02-05 11 views
0

私はmysql_real_escape_stringについて簡単に質問しています。どこで使うべきですか?mysql_real_escape_stringはどこで実行すればよいですか?

私は自分自身にリダイレクトするフォームの* .phpファイルを持っていますが、そのファイルにはクラスが追加されたファイルが使用されています(Add(params))。

投稿時に文字列をエスケープする必要がありますか?

$catName = mysql_real_escape_string($_POST['edtCatAddName']); 

また、クラス内で文字列をエスケープする必要がありますか?

$catName = mysql_real_escape_string($catName); 

おそらく、これらの状況が両方とも間違っていて、何か別の処理を行う必要がありますか?私はこの

$query = mysql_real_escape_string("INSERT INTO cat (catName, catDescr, catImg, catSubLevel, catSubID) VALUES ('$catName', '$catDescr', '$catImgURL', $catSubLevel, $catSubID)"); 

のようなちょうど私のクエリを脱出しようとしました。しかしこの方法は、私のクエリはcatNameので、行くことはありませんし、他のいくつかの変数は文字列型であるため、それがあまりにも良いではないと私は前と後に 'を追加する必要がありますそれらの文字はエスケープされます。

アドバイスはありますか?私はこれに非常に新しいです...私は、PDOを使用している場合

は、だから私がしなければならないすべては

$STH = $DBH->prepare("my raw, not escaped query"); 
$STH->execute(); 

であると私は安心することができますか?

+0

Re:「PDOを使用すれば、私がしなければならないのは '$ STH ...'であり、私は安全に感じることができますか? - 今、私はあなたに有効な例を提示せずにPDOを使用するようにアドバイスしたすべての人を-1にしたい。あなたは誤った準備のステートメントの完全な例です。 – Mchl

答えて

2

どこでもSQLインジェクションからあなたを守るために、PDO prepared statementを使用する必要があります。

+0

+詳細は私の答えを読む – Shoe

0

あなたが行うことができます。

$catName = mysql_real_escape_string($_POST['catName']); 

またはあなたのクエリで直接mysql_real_escape_string()を使用しています。

数値(整数、浮動小数点数)であると予想される値の場合は、整数の場合はintval($var)、浮動小数点の場合はfloatval($var)のいずれかを使用できます。

しかし:
は、クエリ全体のためにmysql_real_escape_string()を使用しない - それは単に間違って;-)

EDITです:
私は言及を忘れてしまった:最高のPDO(のPHP Data Objects)を使用することです - >http://de.php.net/PDO

0

しないでください。 mysqliまたはPDOを使用するクエリでパラメータを使用します。

+0

Mysqliは本当に何も解決しません。とにかく彼はその入力を逃れなければならないでしょう。 – Shoe

1

mysql_real_escape_stringの()を使用し

実際mysql_real_escape_string()がしばらく使用され、ユーザからの入力をサニタイズ。だから、少なくともどこでも、ユーザーがクエリに入るものを入力できるようにする必要があります。 Prepared Statementsを使用することも非常に推奨されています。

はプリペアドステートメントは何

は基本的に、彼らは非常に安全であるSQLクエリです。 例を見てみましょう。

SELECT UserName FROM user WHERE UserUID = X 

単純なクエリです。 X$_GET入力から来る変数であるとします。一部のユーザーはXにすべてを追加できます。 1;し、新しいクエリを開始します。この手法はSQL Injectionと呼ばれています。

mysql_real_escape_string()で、あなたはこの問題の一部を解決します。それは非常に安全です。しかし、プリペアドステートメントをサーバーに伝える

SELECT UserName FROM user WHERE UserUID = 

ことはXが可変であることを、静的一部のようなものです、と。このようにして、サーバーはちょっとというようなクエリを実行するようにを用意しました。それ以外の入力は、Xの入力を考慮していません。このようにして、ユーザの入力をまったく心配する必要はありません。

+0

準備されたステートメントが本当に何であるかを説明するため+1。 MySQLiはプリペアドステートメントもサポートしています(ただし、いくつかのユーティリティクラスでAPIをラップしないと、APIはかなり厄介です)。また、準備されたステートメントは、それぞれの場合に使用することができない(または困難である)、また誤用され、セキュリティ上の利点をまったく提供しない可能性があります。詳細はBill Karwinの優れた「SQL反パターン」のプレゼンテーションを参照してください。 – Mchl

+0

ああ、それを知らなかった。私はPDOがあらゆるところで使いやすく、どんな場合でも利益をもたらしたと私は思いました(どこか、おそらくここ)。私は私のプロジェクトでそれを使用しています、そして、私のすべてのニーズを解決するようです。 PDOがどのようにメリットを与えてはならないかの例を挙げてください。 – Shoe

+0

私はPDOについてではなく、準備されたステートメント(PDOであれ、MySQLiであれ、どこからでも)を話しています。参照:http://www.scribd.com/doc/2670985/SQL-Antipatterns-スライド163に進み、スライド181と182に特に注意してください。しかし、一般的には、準備されたステートメントは非常に便利です。 – Mchl

関連する問題