Как мне избежать только одинарных кавычек?

#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 на ' .

Счастливого избежания инъекций!