0

私はポータルに取り組んでおり、MySQLテーブルへのデータの保存に関して次のいくつかの質問があります。

  1. エスケープされたvarcharフィールドを保存する必要がありますか?文字列の挿入を回避するために、現在mysql_real_escape_string()を使用しています。

  2. エスケープせずに保存する必要があるのはなぜですか(これはこのWebサイトの男によって提案されました)。また、一重引用符や二重引用符などの文字に対してどのように機能するのでしょうか。それはSQLコマンドを破壊しませんか?

このトピックについて簡単に話します。

そして最後にもう1つ....mysql_real_escape_stringを使用する前にaddslashesとstripslashesを使用していましたが、それは私のために機能しました(もちろん、mysql-悪意のあるコードインジェクションで、最近発見して文書化しました)...

ありがとう

4

2 に答える 2

2

プログラマーが学ばなければならない非常に基本的なことは、コンテキストの意味です。

私はここで何をしているのですか?文脈の意味を知っていれば、この質問をすることはなかっただろう。これで(私は願っていますが)<test>、HTMLとして表示する方法や、変数をjavascriptに渡す方法を尋ねることはありません。

それで、それはすべてについて何ですか?本当に簡単です。コンテキストとは、システム内の何かが別の場所でまったく異なる何かを意味する可能性があるという単純な事実です。

たとえば、あなたの場合、PHP文字列はMySQLとはまったく異なる意味を持つ可能性があります。文字列を渡すだけで、すべてがスムーズに実行されることを期待することはできません。そうではありません。したがって、コンテキストの意味がわかったので、重要な他の何かを知る必要があります。常に古いコンテキストから新しいコンテキストに値を変換する必要があります。いつも。

繰り返しますが、あなたの場合、それmysql_real_escape_string()はですが、警告の言葉です。変換関数はコンテキスト固有であるため、たとえば、mysql_real_escape_string()PHPからJavascriptに文字列を渡すために使用することはできません。addslashes()同様に、単に使用して機能することを期待することはできません。実際、addslashes()は完全に役に立たず、誤解を招く関数であると私は主張します。自分が何をしているかについて確信が持てない限り、使用しないでください

于 2012-06-03T20:44:58.500 に答える
1

エスケープされたvarcharフィールドを保存する必要がありますか?

いいえ。SQLで特別な意味を持つ文字(データ内)が問題を引き起こさないように、データをエスケープする必要があります。

SQLを通過してデータベースに格納されると、エスケープされなくなります。

文字列の挿入を回避するために、現在mysql_real_escape_string()を使用しています。

そうしないでください。代わりに、プリペアドステートメントとパラメータ化されたクエリを使用してください

私はaddslashesとstripslashesを使用していました

addslashesエスケープの基本的な形式です。データのターゲットが何であるかを正確に知らない限り、それは無意味です。そのようなものが存在する場合は、より具体的なものを使用する必要があります(そして、あなたは– mysql_real_escape_string)

stripslashesの反対を行いaddslashesます。それらを一緒に使用することはまったく無意味です。

于 2012-06-03T20:27:54.200 に答える