たとえば、私はこのコンテンツを含むphpスクリプトを持っています:
<?php
$msg = addslashes("I'm a message. The what happened >:(");
echo "<script>alert($msg); return false;</script>";
?>
しかし、アラートは最後の "("で壊れます。どうすればこれを解決できますか?
たとえば、私はこのコンテンツを含むphpスクリプトを持っています:
<?php
$msg = addslashes("I'm a message. The what happened >:(");
echo "<script>alert($msg); return false;</script>";
?>
しかし、アラートは最後の "("で壊れます。どうすればこれを解決できますか?
alert
パラメータは引用符で囲む必要があります。
echo "<script>alert('$msg'); return false;</script>";
コードがブラウザに出力するものは次のとおりです。
<script>alert(The what happened >:(); return false;</script>
これは有効なJavaScriptではありません。引用符を付けると、次のようになります。
<script>alert('The what happened >:('); return false;</script>
これは有効なJavaScriptです。
JavaScript文字列に入れる必要があります。そうしないと、次のように解釈され、意味がなく、エラーが発生します。
<script>alert(The what happened >:(); return false;</script>
JavaScript文字列を示す呼び出し内の一重引用符に注意してくださいalert()
(二重引用符も機能します)。
<?php
$msg = "The what happened >:(";
echo "<script>alert('$msg'); return false;</script>";
?>
を使用して、XSSを軽減するために、内部のコンテンツをエスケープすることもお勧めしhtmlspecialchars()
ます。
他の答えは正しい線に沿っていますが、任意の文字列である可能性がある場合は、文字列を引用符で囲むだけでは不十分です。文字列自体に引用符、円記号、または改行が含まれている場合、JavaScript文字列リテラルが壊れます。文字列に含まれている場合</script
(または</
場合によっては)、<script>
ブロックが壊れます。いずれの場合も、ユーザーが入力したものが含まれていると、古いクロスサイトスクリプティングのセキュリティホールが大きくなります。
この特定の値の場合は必要ないかもしれませんが$msg
、JS-string-literal-出力するテキストをJS文字列にエスケープすることに慣れておくことをお勧めします。バックスラッシュを追加することでこれを手動で行うことができますが、一般に、組み込みのJSONエンコーダーを使用する方がはるかに簡単です。これは、文字列だけでなく、配列やオブジェクトなどの他のタイプでも機能します。
<script type="text/javascript">
alert(<?php echo json_encode($msg); ?>);
return false; // huh? return, in a <script> block??
</script>
コンテキストによっては、次のことも行うことができます。
<?php
$msg = "The what happened >:(";
?>
<script>alert("<?php echo $msg ?>"); return false;</script>
HTMLまたはJavaScriptコードをエコーする必要がない場合は、エコーしないでください。メンテナンスが簡単です。
alert()
文字列引数を受け入れます。渡すテキストを引用符(シングルまたはダブル)で囲み、文字列内の一致する引用符がバックスラッシュでエスケープされていることを確認する必要があります。
あなたの場合、一重引用符で十分です:
echo "<script>alert('$msg'); return false;</script>";