2011-01-23 6 views
10

私は、mysql(mysqli)の実際のエスケープ文字列と組み合わせて動的mysqlクエリを使用することで大きな利益を受けるアプリケーションを持っています。 mysqlの実際のエスケープを通してユーザーから受け取ったすべてのデータを実行した場合、mysqlプリペアドステートメントと同じ安全性がありますか?sqlを使った動的なmysqlクエリは、プリペアドステートメントと同じようにエスケープしますか?

答えて

4

間違いなく

タイトルに質問があいまいであるとと解釈できる「すべてのそれはをフォーマットされた部分適切だとダイナミックなMySQLのクエリをしています...」とこのように肯定的な答えを持っている間は、体内での質問ですない

私はそれが準備文をMySQLを使用して同じように安全であるだろうmysqlの実際のエスケープを介してユーザから受信したすべてのデータを実行した場合は?

あなたが近づくこの質問に見れば、これはちょうどマジッククオート化身であることを理解するであろう!この不名誉な、廃止され削除された機能の目的は、「すべてのユーザー入力をエスケープで実行する」ことです。
魔法の引用が悪いことは誰もが知っています。 それではなぜ肯定的な答えですか?

さて、なぜ、一括エスケープが悪いのか、再び説明する必要があるようです。

問題の根本は、ほぼすべてのPHPのユーザーによって共有、非常に強力な妄想です:
誰もがエスケープは、「危険な文字」(?彼らは何をしている)、「安全」、それらを作る(上の何かをするという奇妙な信念を持っていますどうやって?)。言うまでもなく、それは完全なごみです。

真実は次のとおりです。

  • エスケープは、何かを "サニタイズ" しません。
  • エスケープは注射とは関係ありません。
  • エスケープはユーザーの入力とは関係ありません。

エスケープは、単にと他には何を書式文字列です。
必要なときには、注射可能であっても必要です。
あなたがそれを必要としないとき - 少しでも注射に役立つことはありません。注射の反対ではないのお手伝いをします。この

$clean = mysql_real_escape_string($_POST['some_dangerous_variable']); 
$query = "SELECT * FROM someTable WHERE somevalue = $clean"; 

よう
コード:

は、準備された文との違いといえば、(既にsql-injectionタグの下に何度も言及した)少なくとも一つの問題があります。
エスケープは、文字列の書式設定機能に過ぎず、注入防止機能ではありません。
に移動します。あなたが唯一の悪名高い「ユーザー入力」に対してそれを使用している

  • 場合
    は、それらの両方が、注射からあなたを保証するものではありません、ない厳格なルールとして:

    しかし、脱出準備された文と共通の何かを持っていますデータソースに関係なく、ANYクエリをビルドする場合

  • データではなく識別子またはキーワードを挿入する必要がある場合に備えてください。

は、このような状況で安全で説明する私の答えを参照するにはFULL sql injection protection how-to

かいつまん:

:あなたは2不可欠修正し、あなたの最初のステートメントに1件の追加を行う場合にのみ、自分が安全で考えることができます

ユーザから受け取ったすべてのデータをmysqlのリアルエスケープで実行した場合は、常にで囲みます(ircmaxellが述べたように、mysqli_real_escを作成するにはmysqli_set_charset()が使用されます)。 ape string()実際には(GBKのような奇妙なエンコーディングを使用するような稀な機会に)実際に作業をします)、それはmysqlプリペアドステートメントを使用するのと同じくらい安全でしょうか?

これらのルールに従えば、ネイティブプリペアドステートメントほど安全です。

+0

すみません。私はかわいそうにしようとはしていませんが... "_両者は保証しません_ ..." –

+0

私は赦しを請う、文法や意味はありますか?前の投稿 - 私の投稿を編集してもよろしいですか、と感謝しています。私はネイティブスピーカーではなく、時には自分の間違いを見ることができません。 –

17

はい、資格ありです。

入力の100%を適切にエスケープする必要があります。また、文字セットを正しく設定する必要があります(C APIを使用している場合は、SET NAMESの代わりにmysql_set_character_set()に電話する必要があります)。 1つの小さなものが欠けていると、あなたは脆弱です。あなたがすべてのことを正しく行う限り、はいです。

これは、多くの人が準備クエリを推奨する理由です。彼らがもっと安全であるからではありません。しかし、彼らはもっと許しているので...

+0

perparedステートメントは2回の往復を持ち、準備と実行を行います。毎回データベースへのラウンドトリップとして変数countにmysqlエスケープ文字列を実行しますか? – bshack

+0

@bshack:私はそう信じていない。それは開いている接続からの文字セットを使用するので、ラウンドトリップする必要はありません(しかし、私は間違っている可能性があります、私はAPIのソースコードを検査していない、[ドキュメント](http:// dev。 mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html))... – ircmaxell

+0

文字セットの設定以外に何か必要なことはありますか? – Michael

1

@ircmaxellはそれを直しました。

フォローアップとして、この種のことを注意してください。
私はそれをすべての時間を行うために使用:

<?php 

//sanitize the dangerous posted variable... 
$clean = mysql_real_escape_string($_POST['some_dangerous_variable']); 

//...and then forget to use it! 
$query = "SELECT * FROM someTable WHERE somevalue = '{$_POST['some_dangerous_variable']}'"; 

?> 

そして、私は「それを行うために使用される」と言うとき、私は何を意味することは、私が最終的にあきらめ、ちょうどプリペアドステートメントを使用して開始したということです!

関連する問題