PHPでレンダリングされた文字列を使用するJavaScriptコードを書いています。 PHP文字列で単一引用符(および単一引用符のみ)をエスケープするにはどうすればよいですか?
<script type="text/javascript">
$('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>');
</script>
簡単に言うと、echo str_replace('\'', '\\\'', $myString);
ただし、より信頼性の高い JSON および json_encode()
関数の使用をお勧めします(たとえば、新しい行を引用します)。
<?php $data = array('myString' => '...'); ?>
<script>
var phpData = <?php echo json_encode($data) ?>;
alert(phpData.myString);
</script>
\
で文字をエスケープしたい場合、addcslashes()
があります。たとえば、質問のように単一引用符のみをエスケープしたい場合は、次のようにします。
echo addcslashes($value, "'");
'
、"
、\
、およびnul
(バイトnull)をエスケープする場合は、addslashes()
を使用できます。
echo addslashes($value);
str_replace("'", "\'", $mystringWithSingleQuotes);
場合によっては、エンティティに変換するだけです:
// i.e., $x= ABC\DEFGH'IJKL
$x = str_ireplace("'", "'", $x);
$x = str_ireplace("\\", "\", $x);
$x = str_ireplace('"', """, $x);
HTMLページでは、視覚的な出力は同じです。
ABC\DEFGH'IJKL
ただし、ソースはサニタイズされます。
単一引用符のみを置き換えるには、次の簡単なステートメントを使用します。
$string = str_replace("'", "\\'", $string);
addcslashes 関数を使用して、次のように実行できます。
echo addcslashes($text, "'\\");
ネイティブ関数htmlspecialchars
を使用します。すべての特殊文字からエスケープします。引用から具体的にエスケープする場合は、ENT_COMPAT
またはENT_QUOTES
を使用します。以下に例を示します。
$str = "Jane & 'Tarzan'";
echo htmlspecialchars($str, ENT_COMPAT); // Will only convert double quotes
echo "<br>";
echo htmlspecialchars($str, ENT_QUOTES); // Converts double and single quotes
echo "<br>";
echo htmlspecialchars($str, ENT_NOQUOTES); // Does not convert any quotes
出力は次のようになります。
Jane & 'Tarzan'<br>
Jane & 'Tarzan'<br>
Jane & 'Tarzan'
この問題と長い間闘ってきた後、私はより良い解決策を見つけたと思います。
2つの関数を組み合わせると、文字列をエスケープしてHTMLとして使用できるようになります。
JavaScript関数呼び出し内で文字列を使用する場合は二重引用符をエスケープし、引数を囲む単純な引用符を避けるために単一引用符をエスケープします。
解決策:
mysql_real_escape_string(htmlspecialchars($string))
解決する:
echo 'onclick = "javascript_function(\' '。mysql_real_escape_string(htmlspecialchars($ string))"
次の関数を書きました。以下を置き換えます。
スラッシュと一重引用符[\ ']を含む一重引用符[']。
バックスラッシュ[\]と2つのバックスラッシュ[\\]
function escapePhpString($target) {
$replacements = array(
"'" => '\\\'',
"\\" => '\\\\'
);
return strtr($target, $replacements);
}
これを変更して、$ replacements配列の文字置換を追加または削除できます。たとえば、\ r\nを置き換えると、「\ r\n」=>「\ r\n」および「\ n」=>「\ n」になります。
/**
* With new line replacements too
*/
function escapePhpString($target) {
$replacements = array(
"'" => '\\\'',
"\\" => '\\\\',
"\r\n" => "\\r\\n",
"\n" => "\\n"
);
return strtr($target, $replacements);
}
Strtrの素晴らしい機能は、長い置換を好むことです。
たとえば、「Cool\r\nFeature」は、\ nをエスケープするのではなく、\ r\nをエスケープします。
これが私がやった方法です。愚かな、しかしシンプル。
$singlequote = "'";
$picturefile = getProductPicture($id);
echo showPicture('.$singlequote.$picturefile.$singlequote.');
JavaScriptコードを呼び出して画像を表示するHTMLの出力に取り組んでいた...
あなたがあなたのデータで何をしているのか正確にはわかりませんが、あなたはいつも試すことができます:
$string = str_replace("'", "%27", $string);
文字列が保存のためにデータベースに送信されるたびにこれを使用します。
%27は '文字のエンコードであり、サーバーに送信される文字列に単一の'
文字が含まれている場合、GET要求の中断を防ぐのにも役立ちます。誰かが手動でPHP関数にデータを送信しようとする場合に備えて、JavaScriptとPHPの両方で 'を%27に置き換えます。
エンドユーザーにわかりやすくするには、サーバーから取得したすべてのデータに対して逆置換関数を実行し、すべての%27部分文字列を'
に置き換えます。
ハッピーインジェクション回避!