引用符を含んだ文字列をJavascriptに埋め込みたい

投稿者: Anonymous

場所名の英語のデータをfor文で取得して、

var contentString_restaurant = '<p><a href="//www.hoge.com/restaurant/<?php echo $nearest_restaurants[$i]['Restaurant']['id'];?>/" target="_blank"><?php echo $nearest_restaurants[$i]['Restaurant']['en_name'];?></a></p>'

googlemapで表示させたいのですが、取得した$nearest_restaurants[$i]['Restaurant']['en_name']内にシングルクォーテーションが含まれている為にエラーとなってしまいます。

個別の変数の場合は¥等でエスケープできますが、このように複数取得する場合、綺麗にシングルクォーテーションをエスケープする方法はありますか?

解決

この例ではHTMLとしてのエスケープとjavascriptとしてのエスケープの両方をする必要があり、エスケープが中途半端だと簡単に脆弱性が生じます。特にjavascriptのエスケープは汎用的な方法がなく難易度が高いものです。phpに限らず、javascriptの変数を動的に生成するのはリスクが高いのでやめましょう。

(PHPによるjavascriptの変数の生成の時にjson_encode()を使う方法を提案される方もいますが、安全に利用するには適切なパラメータを指定する必要があり、ただjson_encode()を使えばよいというものではありません)

この例での代替案としてはPHPで$nearest_restaurantsのデータを含んだHTMLを生成するのではなく、そのデータをJSON形式で出力するAPIを用意して、javascriptからそのAPIを使用してデータを取得し処理するのがよいのではないでしょうか。

また、webアプリを安全に実装するのは意外に難しいので、信頼できる書籍(「体系的に学ぶ安全なWebアプリケーションの作り方」はおすすめ出来ます)などできちんと勉強されることをお勧めします。

回答者: Anonymous

Leave a Reply

Your email address will not be published.