#php #escaping
#php #экранирование
Вопрос:
Я пишу некоторый код JavaScript, который использует строку, отображаемую с помощью PHP. Как я могу избежать одинарных кавычек (и только одинарных кавычек) в моей строке PHP?
<script type="text/javascript">
$('#myElement').html('say hello to <?php echo $mystringWithSingleQuotes ?>');
</script>
Комментарии:
1. Вам нужно экранировать не только одиночные кавычки. Например, новые строки. Вы могли бы преуспеть с чем-то вроде
addcslashes($mystringWithSingleQuotes, "'"rn\t..37")
2. Вместо того, чтобы обрабатывать экранирование самостоятельно, используйте
json_encode()
для получения допустимой строки Javascript (и удалите внешние одинарные кавычки).3. @Frank: Вы можете опубликовать свой ответ как ответ, а не как комментарий? Правильные ответы в комментариях не могут быть выбраны и, следовательно, создают поддельные «вопросы без ответа».
4. Почему вы не можете просто заключить двойные кавычки в
.html()
вместо того, чтобы заключать в одинарные кавычки? расширение php произойдет независимо. Делал это для всего, начиная с атрибутов элементов и импорта, а также присваивания переменных внутри блоков скрипта.
Ответ №1:
Довольно просто: echo str_replace(''', '\'', $myString);
Однако я бы предложил использовать JSON и json_encode()
function, поскольку это будет более надежно (например, заключать новые строки в кавычки):
<?php $data = array('myString' => '...'); ?>
<script>
var phpData = <?php echo json_encode($data) ?>;
alert(phpData.myString);
</script>
Комментарии:
1. Все ответы, в которых говорится
str_replace("'","\'", $string)
и подобные, неверны. Рассмотрите строку ‘ Она будет заменена на \’, и это вызовет уязвимость при внедрении. Вместо этого используйте json_encode, как предлагает Crozin.2. Спасибо.. Я знал это, но столкнулся с проблемой, потому что я пытался сделать
JSON.parse('<?php echo json_encode($data);?>');
, и это не удалось, потому что внутри данных была одинарная кавычка. Позже я узнал, что здесь нет необходимости использоватьJSON.parse
.3. json_encode может доставить вам неприятности, если расширение json не было установлено. Прочитайте мое решение ниже, используя strtr (..)
4. @BasilMusa Начиная с версии PHP 5.2, расширение JSON по умолчанию включено в комплект поставки ( исходный код), поэтому я бы не беспокоился об этом.
5. @DavidM. за исключением того, что OP никогда не упоминает JSON и был очень конкретен в отношении того, что ему нужно.
Ответ №2:
Если вы хотите экранировать символы с помощью
, у вас есть addcslashes()
. Например, если вы хотите избежать только одиночных кавычек, подобных вопросу, вы можете сделать:
echo addcslashes($value, "'");
И если вы хотите избежать '
, "
,
и nul
(байт null), вы можете использовать addslashes()
:
echo addslashes($value);
Комментарии:
1. Спасибо, что указали на addcslashes для экранирования произвольных символов.
Ответ №3:
str_replace("'", "'", $mystringWithSingleQuotes);
Ответ №4:
В некоторых случаях я просто преобразую это в ОБЪЕКТЫ:
// i.e., $x= ABCDEFGH'IJKL
$x = str_ireplace("'", "amp;apos;", $x);
$x = str_ireplace("\", "amp;bsol;", $x);
$x = str_ireplace('"', "amp;quot;", $x);
На HTML-странице визуальный вывод тот же:
ABCDEFGH'IJKL
Тем не менее, это исправлено в исходном коде.
Ответ №5:
Используйте встроенную функцию htmlspecialchars
. Он избежит всех специальных символов. Если вы хотите конкретно избежать кавычек, используйте с ENT_COMPAT
или ENT_QUOTES
. Вот пример:
$str = "Jane amp; '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 amp;amp; 'Tarzan'<br>
Jane amp;amp; amp;#039;Tarzanamp;#039;<br>
Jane amp;amp; 'Tarzan'
Подробнее читайте в функции PHP htmlspecialchars()
Ответ №6:
Чтобы заменить только одинарные кавычки, используйте это простое утверждение:
$string = str_replace("'", "\'", $string);
Ответ №7:
Вы можете использовать функцию addcslashes, чтобы сделать это следующим образом:
echo addcslashes($text, "'\");
Ответ №8:
После долгой борьбы с этой проблемой, я думаю, что нашел лучшее решение.
Комбинация двух функций позволяет экранировать строку для использования в качестве HTML.
Первый, чтобы избежать двойных кавычек, если вы используете строку внутри вызова функции JavaScript; и второй, чтобы избежать одинарных кавычек, избегая тех простых кавычек, которые обходят аргумент.
Решение:
mysql_real_escape_string(htmlspecialchars($string))
Решите:
- строка PHP, созданная для вызова функции JavaScript, такой как
echo ‘onclick=»javascript_function(» . mysql_real_escape_string(htmlspecialchars($ string))»
Ответ №9:
Я написал следующую функцию. Он заменяет следующее:
Одинарная кавычка [‘] с косой чертой и одинарная кавычка [‘].
Обратная косая черта [] с двумя обратными косыми чертами [\]
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(
"'" => '\'',
"\" => '\\',
"rn" => "\r\n",
"n" => "\n"
);
return strtr($target, $replacements);
}
Хорошая особенность strtr в том, что он предпочитает длинные замены.
Например, «Cool r nFeature» будет экранировать r n вместо того, чтобы экранировать n вместе.
Ответ №10:
Вот как я это сделал. Глупо, но просто.
$singlequote = "'";
$picturefile = getProductPicture($id);
echo showPicture('.$singlequote.$picturefile.$singlequote.');
Я работал над выводом HTML, который вызывал код JavaScript для отображения картинки…
Ответ №11:
Я не уверен, что именно вы делаете со своими данными, но вы всегда можете попробовать:
$string = str_replace("'", "'", $string);
Я использую это всякий раз, когда строки отправляются в базу данных для хранения.
‘ — это кодировка для символа ‘, и это также помогает предотвратить прерывание запросов GET, если в строке, отправляемой на ваш сервер, содержится один '
символ. Я бы заменил ‘ на ‘ как в JavaScript, так и в PHP на случай, если кто-то попытается вручную отправить некоторые данные в вашу PHP-функцию.
Чтобы сделать его более привлекательным для вашего конечного пользователя, просто запустите функцию обратной замены для всех данных, которые вы получаете обратно с вашего сервера, и замените все подстроки % 27 на '
.
Счастливого избежания инъекций!