2017-08-29 9 views
1

私は自分のサイトにhtmlspecialchars()を使用してユーザーからのステータス投稿を表示しています。 ステータスポストがデータベースに保存され、タイムラインに表示されます。htmlspecialchars()を使用する際に&記号を使用する方法

私は問題は、誰かが何か投稿した場合であるlaravel 5.3

を使用しています:、Netflix & ChillをこれはNetflix & Chill

どのように私はまだ私は安全な、私のサイトを保つことができるようにhtmlspecialchars()を使用していますが、まだ可能に変身&シンボルを&に変更するのではなく、適切なテキストを表示する

+3

HTMLは「&」と解釈し、それを '&'として表示するか、そうでないと経験していますか?おそらく、この関数を文字列に2回使用していますか?これを出力に使用しているのか、データベースに入力していますか? – Qirel

答えて

2

適切なテキストが表示されます。

私があなたが何を記述しているのか見てきた最も一般的な理由は、二重エンコーディングです。 (2回htmlspecialcharsて文字列を渡す。)例えば、

$str = 'Netflix & Chill'; 

あなたがecho htmlspecialchars($str)を使用する場合は

では、ブラウザで「Netflixの&チル」を参照してくださいよ。しかし、代わりに echo htmlspecialchars(htmlspecialchars($str));を使用すると、エスケープされたアンパサンドがブラウザに表示されます。 (ページソースを表示する場合は、実際には Netflix & Chillです。)

出力を自動的にエスケープするテンプレートを使用している場合は、これを誤って行うことがあります。私はあなたがLaravelの質問にタグを付けたことに気付きました。そして、ブレードテンプレートがこれを行います。 the documentationにここを参照してください:

ブレード{{ }}文が自動的にXSS攻撃を防ぐためにPHPのはhtmlspecialchars関数を介して送信されます。

データを表示するために使用している場合は、値をテンプレートに送信する前にhtmlspecialcharsを使用しないでください。

+1

入力されたデータに既に '&'が含まれている可能性があります。 '$ double_encode'パラメータでPHPをダブルエンコーディングから無効にすることができます。 http://php.net/manual/en/function.htmlspecialcharsphpl – Charles

+0

@Charles良い点。私は、テンプレート内の自動エスケープがそのパラメータを使用するのだろうかと思います。 –

+0

@ Don'tPanic私は私のビュー{!! $ linkify-> process(nl2br(htmlspecialchars($ status-> body)))}でこれをやっています! – Luna

0

htmlspecialcharsは、生のASCII文字をHTMLエンティティに変換します。つまり、まだページ上に正しく表示されます(つまり、<のシンボルはページ上に<のように表示されますが、HTMLでは特別な意味はありません)。

したがって、データベースに、彼らはentity codesとして表示されますが、ページ上に描画されたときに、ユーザーが入力した最初の文字としてそれらを見ることができます。

データベースに文字を保存する必要がある場合(私はなぜそうする必要があるのか​​わかりません)、データベースの外観を維持してHTMLの保護が行われないように、homoglyphsに置き換えます単純にhtpspecialcharsを使用している場合は可能です。

関連する問題