
お世話になります。
PHPの「htmlspecialchars」と「htmlspecialchars_decode」につきましてご教授頂けますでしょうか。
【前提】
データベースに「<script>alert(1)</script>」というデータが登録されている。
【やりたいこと】
データベースに登録されている「<script>alert(1)</script>」というデータを「<script>alert(1)</script>」という文字列として表示したい。ただし、XSS対策はされていて、アラート表示はされない状態で単なる文字列として「<script>alert(1)</script>」を画面上に表示したい。
下記のような流れでXSS対策としてエスケープ処理をしました。
① phpで上記【前提】のデータをSQLで抽出(抽出したデータは「$name」に格納)
② <?php echo $name; ?>でブラウザで表示
③ ブラウザで表示するとアラートが表示される(XSSできてしまう状態)
④ 表示内容は「<script>alert(1)</script>」なのでNG。
⑤ XSS対策のため、①で抽出したデータをhtmlspecialcharsで変換($name = htmlspecialchars($name, ENT_QUOTES, 'UTF-8')
⑥ 表示を正しくするため、変換した$nameをhtmlspecialchars_decodeで変換($name = htmlspecialchars_decode($name, ENT_QUOTES)
⑦ <?php echo $name; ?>でブラウザで表示
⑧ アラート表示はなくなり、「<script>alert(1)</script>」という文字列が表示された
【ご教授頂きたいこと】
・上記はエンコードした後にデコードして表示していますが、そもそもこのやり方でXSS対策になっているのでしょうか。結果だけを見るとアラートは表示されず(javascriptは機能せず)、かつ表示も意図した通りになっていますが、「たまたまうまくいっているだけ」や「別の方法で攻撃されたときに対処できない」などがございましたらご指摘頂ければ幸いです。
・上記のような「エンコード⇒デコード」をする以外の方法がございましたら教えて頂けますと幸いです。
※テストの方法が拙いため、「なんでこんなやり方しているのか?」などの疑問がありましたらそちらもご指摘頂ければ説明致します。
以上です。宜しくお願い致します。


回答1件
あなたの回答
tips
プレビュー