m moji kit v1.0.9
` でタグが閉じる事故が起きます。本ツールは < > & を Unicode 形式にして安全に。"}},{"@type":"Question","name":"テンプレートリテラル(バッククォート)でも使える?","acceptedAnswer":{"@type":"Answer","text":"本ツールはバッククォートを `\\\\\\``(バックスラッシュ + バッククォート)にエスケープします。テンプレート内で安全に使えます。"}},{"@type":"Question","name":"ECMAScript 仕様の StringLiteral と JSON 文字列の違いは?","acceptedAnswer":{"@type":"Answer","text":"JS 文字列はシングル / ダブル / バックの 3 種、JSON はダブルのみ。JS は \\v など追加のエスケープがあります。本ツールは JS 用に幅広く対応。"}},{"@type":"Question","name":"Unicode エスケープ \\uXXXX と \\u{XXXXXX} の違い","acceptedAnswer":{"@type":"Answer","text":"前者は BMP のコードポイント(U+0000-FFFF)まで。後者(u フラグ正規表現や ES2015+)はサロゲート不要で大きなコードポイントも扱えます。"}},{"@type":"Question","name":"サロゲートペアの絵文字は?","acceptedAnswer":{"@type":"Answer","text":"本ツールはサロゲートペアをそのまま保持します(壊さない)。手動で \\u{...} 形式にしたい場合は別途処理が必要です。"}},{"@type":"Question","name":"エスケープした文字列を eval() に渡すのは安全?","acceptedAnswer":{"@type":"Answer","text":"eval() はそもそも避けてください。Function コンストラクタも同様。安全性が要求される場面では JSON.parse / 専用パーサを使ってください。"}},{"@type":"Question","name":"PHP の json_encode とは違う?","acceptedAnswer":{"@type":"Answer","text":"json_encode はデフォルトで / を \\/ にエスケープしません(オプション JSON_HEX_TAG / JSON_HEX_APOS / JSON_HEX_QUOT で追加可能)。本ツールは / もエスケープして HTML 内 対策。"}},{"@type":"Question","name":"既にエスケープされた文字列を再エスケープしたら?","acceptedAnswer":{"@type":"Answer","text":"二重エスケープになります(\\n が \\\\n に)。アンエスケープ→再エスケープでない限り、繰り返し適用しないでください。"}}]},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"moji kit","item":"https://mojikit-4iw.pages.dev/"},{"@type":"ListItem","position":2,"name":"エンコード","item":"https://mojikit-4iw.pages.dev/#tools"},{"@type":"ListItem","position":3,"name":"JavaScript エスケープ","item":"https://mojikit-4iw.pages.dev/tools/escape-js"}]}]}
JS
エンコード

JavaScript エスケープ

JavaScript の文字列リテラルに動的な文字列を埋め込む際のエスケープを行います。バックスラッシュ / クォートに加え、< > & も Unicode エスケープに変換し、`</script>` 注入攻撃を防ぎます。

サンプル

こんなときに使う

サーバーで動的に JS を生成する

PHP / Ruby / Python から `<script>var x = "...";</script>` を出力するとき、ユーザー由来の値をエスケープして埋めます。

JSON.stringify で対応しきれない場合

JSON.stringify は基本のエスケープしか行わず、HTML コンテキストでの安全性は保証されません。本ツールは < > & も Unicode 形式に。

ログメッセージを安全に出す

console.log に動的文字列を渡す前にエスケープして、改行や制御文字でログが乱れないようにします。

テストフィクスチャの文字列リテラル化

DB から取得した値を JS のソースコードに埋め込んでテストデータにするとき、エスケープしたまま貼り付けます。

正規表現リテラルに動的文字列を埋め込む前段

new RegExp() より単純な /.../ リテラルに埋め込みたい場合、JS エスケープ → 正規表現エスケープの順で適用します。

テンプレートリテラル内のバッククォートをエスケープ

`...` 内で ` を使いたい場合は \` にエスケープ。本ツールはバッククォートも対象。

よくあるエラーと対処

ERR エスケープしても <script> 注入が成立
原因
HTML の <script> タグ内に動的 JS 文字列を埋めるとき、`</script>` の文字列が中に含まれると HTML パーサがタグを閉じてしまいます。
対処
< > & を Unicode (\u003c など) にエスケープしてください。本ツールはこれを自動で行います。
ERR アンエスケープが想定通り動かない
原因
テンプレートリテラル内の特殊な記法(${...})はエスケープ対象外なので、入力に含まれていてもそのまま通ります。
対処
本ツールは ECMAScript の文字列リテラル仕様に準拠します。テンプレートリテラルを安全にしたい場合は別途処理が必要です。
ERR 改行を含む文字列が壊れる
原因
改行(U+000A / U+000D)は文字列リテラル内では \n または \r にエスケープしないと構文エラーになります。
対処
本ツールは \n / \r に変換します。テンプレートリテラル(バッククォート)なら改行もそのまま許容されます。
ERR ASCII 制御文字(\0 〜 \x1f)でログが乱れる
原因
NULL バイトやベル文字などの制御文字は端末で挙動を変えます。
対処
本ツールは制御文字を \uNNNN にエスケープします。

CLI / 他言語でやる方法

Node.js JSON.stringify
node -e "console.log(JSON.stringify('<test>'))"

JSON 仕様の範囲ではエスケープ可能。HTML 安全性は別途。

Python
python -c "import json; print(json.dumps('<test>'))"

ensure_ascii=True で全非 ASCII を \u エスケープ。

よくある質問

JSON.stringify で十分ではないですか?
JSON 仕様では < > & は素のまま出ます。HTML の <script> タグ内に埋める場合、`</script>` でタグが閉じる事故が起きます。本ツールは < > & を Unicode 形式にして安全に。
テンプレートリテラル(バッククォート)でも使える?
本ツールはバッククォートを `\\\``(バックスラッシュ + バッククォート)にエスケープします。テンプレート内で安全に使えます。
ECMAScript 仕様の StringLiteral と JSON 文字列の違いは?
JS 文字列はシングル / ダブル / バックの 3 種、JSON はダブルのみ。JS は \v など追加のエスケープがあります。本ツールは JS 用に幅広く対応。
Unicode エスケープ \uXXXX と \u{XXXXXX} の違い
前者は BMP のコードポイント(U+0000-FFFF)まで。後者(u フラグ正規表現や ES2015+)はサロゲート不要で大きなコードポイントも扱えます。
サロゲートペアの絵文字は?
本ツールはサロゲートペアをそのまま保持します(壊さない)。手動で \u{...} 形式にしたい場合は別途処理が必要です。
エスケープした文字列を eval() に渡すのは安全?
eval() はそもそも避けてください。Function コンストラクタも同様。安全性が要求される場面では JSON.parse / 専用パーサを使ってください。
PHP の json_encode とは違う?
json_encode はデフォルトで / を \/ にエスケープしません(オプション JSON_HEX_TAG / JSON_HEX_APOS / JSON_HEX_QUOT で追加可能)。本ツールは / もエスケープして HTML 内 </script> 対策。
既にエスケープされた文字列を再エスケープしたら?
二重エスケープになります(\n が \\n に)。アンエスケープ→再エスケープでない限り、繰り返し適用しないでください。

関連ツール