私は、mysql(mysqli)の実際のエスケープ文字列と組み合わせて動的mysqlクエリを使用することで大きな利益を受けるアプリケーションを持っています。 mysqlの実際のエスケープを通してユーザーから受け取ったすべてのデータを実行した場合、mysqlプリペアドステートメントと同じ安全性がありますか?sqlを使った動的なmysqlクエリは、プリペアドステートメントと同じようにエスケープしますか?
答えて
間違いなく
タイトルに質問があいまいであるとがと解釈できる「すべてのそれはをフォーマットされた部分適切だとダイナミックな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プリペアドステートメントを使用するのと同じくらい安全でしょうか?
これらのルールに従えば、ネイティブプリペアドステートメントほど安全です。
はい、資格ありです。
入力の100%を適切にエスケープする必要があります。また、文字セットを正しく設定する必要があります(C APIを使用している場合は、SET NAMES
の代わりにmysql_set_character_set()
に電話する必要があります)。 1つの小さなものが欠けていると、あなたは脆弱です。あなたがすべてのことを正しく行う限り、はいです。
これは、多くの人が準備クエリを推奨する理由です。彼らがもっと安全であるからではありません。しかし、彼らはもっと許しているので...
perparedステートメントは2回の往復を持ち、準備と実行を行います。毎回データベースへのラウンドトリップとして変数countにmysqlエスケープ文字列を実行しますか? – bshack
@bshack:私はそう信じていない。それは開いている接続からの文字セットを使用するので、ラウンドトリップする必要はありません(しかし、私は間違っている可能性があります、私はAPIのソースコードを検査していない、[ドキュメント](http:// dev。 mysql.com/doc/refman/5.0/en/mysql-real-escape-string.html))... – ircmaxell
文字セットの設定以外に何か必要なことはありますか? – Michael
@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']}'";
?>
そして、私は「それを行うために使用される」と言うとき、私は何を意味することは、私が最終的にあきらめ、ちょうどプリペアドステートメントを使用して開始したということです!
- 1. mongoDBはSQLと同じようにクエリを実行します!
- 2. PHPを使った動的MySQLクエリ
- 3. 同じ文にORとANDを使用したMYSQLクエリ
- 4. PDO/MYSQLプリペアドステートメントはエスケープ文字ではありませんか?
- 5. このsqlを使って `rails console`と同じクエリを実行するとどうなりますか?
- 6. PHPとMYSQLを使った動的な動的製品メニュー
- 7. 類似のSQLクエリと同じように使用してフィルタリングする方法
- 8. 動的PHPドロップダウンに応じた動的MySQLクエリ
- 9. 同義語を使用したSQL動的クエリ
- 10. PHPを使用したMySQLのクエリは、どこでも同じように爆発します
- 11. JdbcCursorItemReaderを使用した動的SQLクエリ
- 12. `wrap_content`はDensity Pixelsと同じように動作しますか?
- 13. JPAにプリペアドステートメント(または動的SQL)を使用するように指示するにはどうすればよいですか?
- 14. 動的に私はこのようなデータと同じようにJSONを持っている形
- 15. SQL:同じクエリ
- 16. SQL - 同じクエリ
- 17. SQL/MySQLは同じテーブルから再帰的に引き出します
- 18. Mysql列= 1と "1_"のような列は同じですか?
- 19. SQLクエリによって動的に作成されたCytoscapeノード
- 20. If/Else節の動的テーブル名MySQLプリペアドステートメント
- 21. プリペアドステートメントのwhere句を使用したSQLクエリ
- 22. MySQLがéをeと同じように扱うのはなぜですか?
- 23. は、私は以下のようにまったく同じである動的メソッド放出したい
- 24. MySQLの - 同じクエリ
- 25. 同じクエリのmySQL
- 26. MongoDB同じオブジェクトに$と演算子を使ったPHPクエリ
- 27. JDOMを使用してXMLファイルをクエリしますか? SQLと同様ですがXMLと同じですか?
- 28. JDBCのエラーは、私がプリペアドステートメントを使用して、SQL Serverのクエリを実行しようとしている
- 29. 同じクエリは異なるインデックスを使用しますか?
- 30. Python3スクリプトが同じクエリのMySQLエンジンと同じ結果を表示しない
すみません。私はかわいそうにしようとはしていませんが... "_両者は保証しません_ ..." –
私は赦しを請う、文法や意味はありますか?前の投稿 - 私の投稿を編集してもよろしいですか、と感謝しています。私はネイティブスピーカーではなく、時には自分の間違いを見ることができません。 –