$var_to_use_in_app = mysql_escape_string(trim($_GET['変数名X']));
それは一般的に間違ったことです。アプリケーションで内部的に使用される文字列は、常にプレーン テキスト バージョンである必要があります。そうすれば、文字列操作のどれもそれを壊すことはなく、ページに間違ったものを出力することはありません.
たとえば、送信された文字列がある場合:
O'Reilly
mysql_escape_string は次のようにエスケープします。
O\'Reilly
その文字列を HTML ページに出力すると、ばかげているように見えます。そして、それをフォームフィールドに出力してから再度送信すると、別のバックスラッシュが得られ、それが 2 つのブラックスラッシュに変わり、再度編集すると 4 つ、8 つに変わります...そしてすぐにあなたは何百ものバックスラッシュで構成される文字列。これは、悪質な magic_quotes 機能がオンになっている、よく書かれていない CMS やサーバーでよく見られる問題です。
次に、名前の最初の 2 文字を取得してデータベース クエリに入力する場合は、部分文字列を切り取ります。
O\
それをクエリに連結します。
SELECT * FROM users WHERE namefirst2='O\';
おっと、構文エラーです。その文字列は現在終了していません。事前にエスケープされた文字列に対する文字列処理の変種は、セキュリティ上の問題に簡単に陥る可能性があります。
このアプローチの代わりに、SQL または HTML で区切られたリテラルに連結する最終出力段階を除いて、アプリケーション内のすべての場所で文字列を単純なエスケープされていないテキスト文字列として保持します。SQL の場合:
"SELECT * FROM users WHERE name='".mysql_real_escape_string($name)."';"
「実際の」関数名に注意してください。単純な古い mysql_escape_string は、東アジア文字セットや ANSI SQL_MODE が設定された接続/データベースなどのまれなケースでは失敗するため、通常は常に「実際の」バージョンを使用する必要があります。
mysql_real_escape_string と同じで、名前が短い関数 (例: m()) を定義して、これを少し見にくくすることができます。または、より良いのは、mysqli のパラメーター化されたクエリを見てください。
HTML の場合、エスケープは htmlspecialchars() 関数を使用して行う必要があります。
<div id="greeting">
Hello, Mr. <?php echo htmlspecialchars($name); ?>!
</div>
echo(htmlspecialchars()) を実行する関数を定義できますが、これを少し見苦しくするために短い名前 (例: h()) を付けます。
htmlspecialchars への呼び出しを見逃した場合、スキャナはサイトが XSS に対して脆弱であることを正確に示しています。しかし、あまり気の毒に思う必要はありません。他のほとんどすべての PHP プログラマーが同じ過ちを犯します。
mysql_[real_]escape_string は、ここではまったく役に立ちません。なぜなら、HTML でテキストを分割する文字は、'&'、'<'、および属性では '"' だからです。 SQL 文字列リテラルなので、mysql_escape_string はまったく触れません。
<script>alert("I'm stealing your cookies! "+document.cookie);</script>
次の場所にのみエスケープされます。
<script>alert("I\'m stealing your cookies! "+document.cookie);</script>
セキュリティに関する限り、これは何の助けにもなりません。