10214


場所名の英語のデータを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']`内にシングルクォーテーションが含まれている為にエラーとなってしまいます。

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


CC BY-SA 3.0
2015-05-15T01:04:14.060
10203
2015-05-15T14:19:43.313
2015-05-15T04:34:22.077
8000
8500
question
php cakephp
引用符を含んだ文字列をJavascriptに埋め込みたい


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

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

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

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


CC BY-SA 3.0
2015-05-15T05:40:00.860
10214
2015-05-15T14:19:43.313
2015-05-15T14:19:43.313
5793
5793
10203
answer


何らかの変数をHTMLへ出力する場合は`htmlspecialchars()`を通すようにすべきです。

CakePHPであれば`h()`がhtmlspecialcharsのエイリアスとして用意されていますので、そちらを使用してください。

javascriptへの渡し方については、json_encode等により変数を設定する他、htmlタグの属性として値を設定してから、javascript側で取得して利用する方法もあります。

php(html)側

[code]

    <a href="#" id="map" data-foo="<?php echo h($foo); ?>">...</a>
    
[/code]

javascript側（jQueryを利用した場合）

[code]

    var foo = $('#map').data('foo');
    // ... foo変数を利用した何らかのコード
    
[/code]

なお、json_encodeについてはこちらの記事を参照するとよいでしょう。

JSONのエスケープ | yohgaki's blog <http://blog.ohgaki.net/json-escape>


CC BY-SA 3.0
2015-05-15T11:22:25.913
10230
2015-05-15T11:22:25.913
2668
10203
answer