3

PHPはデフォルトで「魔法の引用符」を使用しますが、多くの問題があります。PHPの次のメジャーバージョンで無効になることを理解しています。

それに対する議論は理にかなっていますが、私が理解していないのは、スラッシュを削除して削除する代わりに、引用符を表すためにHTMLエンティティを使用しないのはなぜですか?結局のところ、mySQLのVASTの大部分はWebブラウザへの出力に使用されていますか?

たとえば、' 'の代わりに使用され、データベースにはまったく影響しません。

別の質問ですが、PHPでこのタグ<?php4または<?php5を使用してPHPのバージョンごとに構成を設定できないので、これらのバージョンに適切なインタープリターをロードできるのはなぜですか?

ちょっと興味があるんだけど。:)

4

6 に答える 6

9

データベース&#039;のコンテンツを Web ページに出力するためだけに使用する場合は、データベースの文字列列に配置しても問題ありません。しかし、そうではありません。

出力時に出力をエスケープすることをお勧めします。ログ ファイル、電子メール、またはその他の宛先ではなく、出力が Web ページに送信されることを確認できるのは、このときだけです。

PS: PHP は、標準の php.ini ファイルで、マジック クォートをデフォルトでオフにしています。PHP 5.3 で非推奨になり、PHP 6.0 で言語から完全に削除されます。

于 2009-08-26T04:01:24.660 に答える
5

ほとんどの場合、投稿された独自の回答に対する正当な理由があります: Using htmlspecialchars()or htmlentities() does not make your SQL query safe . それがmysql_real_escape_string()の目的です。

問題を引き起こすのは一重引用符と二重引用符のみであると仮定しているようです。MySQL クエリは実際には、データ内の\x00\n\r\、および文字に対して脆弱です。準備済みステートメントまたは を使用していない場合は、SQL インジェクションの脆弱性があります。'"\x1amysql_real_escape_string()

htmlspecialchars()これらの文字をすべて変換しhtmlentities()ないでください。したがって、これらの関数を使用してクエリを安全にすることはできません。そのaddslashes()ために、クエリを安全にすることもできません!

その他の小さな欠点には、MySQL が常にWeb コンテンツに使用されているとは限らないことについて他の投稿者が既に述べていること、およびデータに必要なストレージとインデックス スペースの量を増やしているという事実が含まれます (見積もりの​​ために 1 バイトのストレージを検討してください)。文字、エンティティ フォームの場合は 6 バイト以上のストレージ)。

于 2009-08-26T04:56:06.140 に答える
2

私はあなたの最初の質問にのみ答えます。

入力の検証はとにかく間違ったアプローチです。重要なのは入力ではないため、問題はそれがどこで使用されるかです。PHPは、MySQLクエリへのすべての入力がHTMLエンティティが意味をなすコンテキストに出力されると想定することはできません。

magic_quotesが実行されているのを見るのは素晴らしいことです。これはPHPの多くのセキュリティ問題の原因であり、彼らが新しいアプローチを取っているのを見るのは素晴らしいことです:)

検証アプローチを再構成して、作業しているコンテキストに対してOUTPUTで検証すると、大きなメリットがあります。これを知ることができるのは、プログラマーであるあなただけです。

于 2009-08-26T03:56:53.733 に答える
1

MySQL が に変換しない理由'は、ではない&#039;ためです。データを出力用に変換する場合は、データベースではなく、ビュー レイヤーで行う必要があります。エコーする前/エコーするときに呼び出すのは、それほど難しくありません。&#039; 'htmlentities

于 2009-08-26T03:57:57.910 に答える
0

'に変換することはできません&#039;。考えてみてください: 文字列 " " を保存したい場合はどうなります&#039;か? 保存&#039;すると、ページをロードしたときに表示されますが、 では'ありません&#039;

したがって、引用符だけでなく、すべての HTML エンティティを変換する必要があります。その後、あらゆる種類の奇妙な変換の問題が発生し始めます。最も簡単な解決策は、実際のデータをデータベースに保存し、好きなように表示することです。実際の引用符を使用することをお勧めします - ほとんどの場合、タグ ブラケットの外側に害を及ぼすことは"あり'ません。

場合によっては、実際の HTML をフィールドに保存してそのまま表示したい場合があります (出入りするときにチェックおよびサニタイズされている場合に限ります)。

于 2009-08-26T12:28:14.120 に答える
0

みんな、ありがとう。スラッシュを追加する代わりに引用符をHTMLエンティティに変更した場合の意味と、それが持つ可能性のある意味を本当に考えなければなりませんでしたが、実際には出力/入力も変更されていませんか?

すべてのデータが HTML エンティティを使用してエンコードされていることを明確にしている限り、mySQL に HTML エンティティを使用できない、または使用すべきではない理由が思いつきません。結局のところ、私の主張は、mySQL の大部分が HTML ブラウザへの出力に使用されているという事実と、「および」および / が mySQL データベースに深刻な損害を与える可能性があるという事実に基づいています。 "そして / INSERT クエリとして送信する前に HTML エンティティとして? また、XML に移行するので、HTML エンティティで既にエンコードされているデータにアクセスするときに、なぜ htmlentities を記述したり、ストリップスラッシュや追加スラッシュを書いたりして時間を無駄にするのでしょうか?

于 2009-08-26T04:25:49.057 に答える