2014-01-06 1 views
5

これは少し混乱しています。私はhtmlspecialchars()について読んでおり、XSS攻撃を防ぐためにテキストエリアPOSTにこれを使用する予定です。私は通常htmlspecialchars()がブラウザに送信されるHTML出力を生成するために使用されることを理解しています。しかし、わからないことは次のとおりです。MySQLに挿入する前にhtmlspecialchars()を使用するのは良いですか?

1)htmlspecialchars()をMySQLに挿入する前に、ユーザ入力データに安全な練習をしていますか?私はすでにSQLインジェクションを防ぐためにパラメータ化された値を持つPDO準備文を使用しています。

2)またはhtmlspecialchars()を(パラメータ化されていれば)挿入された値に使用することについて心配する必要はありません。htmlspecialchars()を使用してMySQLから結果を取得し、ユーザーに表示しますか?

+5

#2は正しい答えです – jszobody

+5

HTMLエスケープ(1)はデータベースにはあまり関係ありません。早すぎるエスケープはWebページ以外の出力チャネルで後で干渉する可能性があるため、一般的に(2)が好まれます。初心者にとっては、HTMLエスケープの早い段階が推奨されるかもしれません。あまりにも早く、後で忘れたよりも早い。 – mario

+1

テキストログを生成したいとします。その後、エスケープを取り消す必要があります。代わりに、可能な最後の瞬間に脱出して、それが適切であることを知ってください。 –

答えて

11

他の人が指摘しているように、#2が正しい答えです。あなたがそれを必要とするまで "未加工"のままにしておき、適切に逃げる。

なぜか(そして私は他の投稿を繰り返す/要約します)、シナリオ1を論理的な極端にしましょう。

' OR 1=1 <other SQL injection> --」と入力するとどうなりますか?おそらく、SQLを使用しているために、(パラメータ化された文を使用していなかったため)SQLをエンコードする必要があるかもしれません。ですから、今度はSQL &のHTMLエンコーディングを混在させる必要があります。

突然あなたの上司はXML出力を望んでいると判断します。今度は、パターンの一貫性を保つために、エンコードする必要があります。

次CSV - ああ!テキストに引用符とカンマがある場合はどうなりますか?もっとエスケープ!

ちょっといいインタラクティブなAJAXインターフェイスはありますか?今すぐJSONをブラウザに送り返したいと思っていますので、{、[などはすべて考慮する必要があります。助けて!!

明らかに、データは必要に応じての時点で出力としてに適切なエンコードを施してください(もちろんドメインの制約に従います)。 あなたの出力はあなたのデータと同じではありません。

私はこの答えがあまりにもひいきにならないことを願っています。他の回答者の信用

+0

私を要約して#2がベストプラクティスとなる理由を説明してくれてありがとう。 :) – Neel