одинарная кавычка в имени файла - javascript, php - PullRequest
3 голосов
/ 04 ноября 2010

Как я могу справиться с цитатой в данных, которые должны быть там?

Это утверждение javascript работает нормально, пока название города не станет "ST JOHN'S". Мы не можем изменить название города в базе данных или использовать более надежный ключ.

$('#map_output').html('<p><img src="img/map/<?=$CITY_OUT?>_map.PNG" width="600"></p>')

Ответы [ 7 ]

6 голосов
/ 04 ноября 2010

Использование htmlspecialchars().

РЕДАКТИРОВАТЬ: вы используете его (Сорта), как json_encode:

<?=htmlspecialchars($CITY_OUT, ENT_QUOTES)?>

Но htmlspecialchars более семантический - json_encode предназначен для генерации JSON (внутренний, представление данных), а не для представления.

Ник Крейвер прав, хотя - это тоже сработает.

Редактировать : необходимо ENT_QUOTES для правильного отображения "'" ...

2 голосов
/ 04 ноября 2010

Требуется три уровня кодирования:

Вы создаете URL-адрес, поэтому вам необходимо кодировать его по URL-адресу:

$url = rawurlencode('img/map/'.$CITY_OUT.'_map.PNG');

Вы создаете атрибут HTML,поэтому вам нужно закодировать его в HTML:

$html = '<p><img src="'.htmlspecialchars($url).'" width="600"></p>';

Этот второй шаг может не иметь большого значения, поскольку у вас вряд ли будет ', ", &, < или > в вашем URL.Но если вы хотите быть строго правильным, вам следует закодировать все атрибуты HTML.Это хорошая привычка, поэтому вы можете обрабатывать все специальные символы.

Наконец, вы создаете значение JavaScript, поэтому вам нужно JSON-кодировать его:

$('#map_output').html(<?= json_encode($html) ?>)

(отредактировано для добавления JSON-кодировки)

2 голосов
/ 04 ноября 2010

Вы можете использовать json_encode(), чтобы экранировать кавычку, например:

<?=json_encode($CITY_OUT)?>
1 голос
/ 04 ноября 2010

В моих быстрых тестах ни один из двух ответов не сработал:

<?php

  $string = "ST JOHN'S";
  $json = json_encode($string);
  $html =  htmlspecialchars($string);
  $escape = str_replace("'", "\'", $string);


  ?>

  <script type="text/javascript">
    alert('<?php echo $escape?>');
    alert('<?php echo $html?>');
    alert('<?php echo $json?>');
  </script>

Единственным тестом, который не вывел ошибку javascript, было мое использование str_replace для фактического экранирования одиночной кавычки.

0 голосов
/ 04 ноября 2010

Вы сказали, что ни одно из приведенных решений не сработало для вас, но я думаю, что на самом деле они в порядке (по крайней мере, некоторые из них). Позвольте мне продемонстрировать:

Вот примеры, которые вы перечислили:

$json:
<img src="img/map/"ST JOHN'S"_map.PNG"/ width="600">
$html:
<img src="img/map/ST JOHN&#039;S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN&#039;s_map.PNG"/ width="600">
$escape:
<img src="img/map/ST JOHN\'S_map.PNG"/ width="600">
$urlenc:
<img src="img/map/ST%20JOHN%27S_map.PNG"/ width="600">

Я не вижу проблем ни с одним из них (кроме JSON, который я объясню чуть позже).

И я только что попробовал все эти примеры, пытаясь смоделировать ваш сценарий как можно точнее (даже вплоть до использования одного и того же имени файла) .... Все они загружали графику правильно, опять же, за исключением примера JSON.

Пример JSON нуждается в незначительной настройке, чтобы он заработал, но он также экранирует строку в работоспособном виде. Чтобы это работало, вам нужно принять во внимание, что JSON создает полностью заключенную в кавычки строку Javasscript, а не просто экранировать ее, как это делают другие, поэтому вы должны изменить вывод, чтобы закрыть кавычки и добавить строки вместе, например так:

$('#map_output').html('<p><img src="img/map/"+<?=$json?>+"_map.PNG"/ width="600"></p>');

Другим решениям это не нужно. Все они работают как есть. Как я уже сказал, я попробовал их, и все они загрузили изображение на страницу.

В этом контексте все три механизма (экранирующие \', сущности &#039 и кодировка URL %27) являются действительными:

  • Экранирование работает, потому что вы находитесь в контексте Javascript, поэтому обратный слеш обрабатывается Javascript, и окончательно сгенерированный HTML, вставленный на страницу, не будет его содержать.

  • Сущности работают, потому что HTML переводит сущности в сопоставленный символ, поэтому &#039 на странице HTML совпадает с одинарной кавычкой, даже в пределах значения атрибута, как в этом случае.

  • Кодировка URL работает, потому что браузеры переводят их при загрузке URL.

Я бы сказал, что в этом случае правильное решение - это кодировка URL, поскольку она используется для URL. Причина этого заключается в том, что, хотя все решения работают для данного примера, если у вас есть какие-либо примеры, содержащие знак вопроса или знак амперсанда (&) или несколько других зарезервированных символов, то кодирование URL будет единственным решением, которое будет работать в этих случаях. С другой стороны, если вы отображаете выходные данные на своей HTML-странице в другом контексте, то сущности - это путь. И если он будет использоваться только в Javascript, то ответом будет JSON.

Но вы говорите, что никто из них не сделал этого. Мой вопрос: вы на самом деле пробовали их? Вы запустили код, и изображение не удалось загрузить? Это для меня. С другой стороны, если они работали, но все еще не «справились», то чего же вы на самом деле хотите?

Я предполагаю, что на самом деле вы имеете в виду, что вы хотите получить простой символ цитаты, но он должен работать волшебным образом. Этого не может быть; для того, чтобы он работал, кавычка так или иначе должна быть экранирована, но пользователь никогда не увидит экранированную версию, так что об этом не нужно беспокоиться.

На самом деле вы должны экранировать или кодировать все строки, которые вы вводите или выводите, чтобы недопустимые символы работали. В противном случае у мистера О'Брайена будут проблемы с вводом его имени на ваш сайт, и если он будет управлять им, у вас будут проблемы с отображением его позже.

0 голосов
/ 04 ноября 2010

К сожалению, ни одно из вышеперечисленных решений не помогло.

<?
    $string   = "ST JOHN'S";
    $json     = json_encode($string);
    $html     = htmlspecialchars($string, ENT_QUOTES);
    $htmlent  = htmlentities($string, ENT_QUOTES);
    $escape   = str_replace("'", "\'", $string);
    $urlenc   = rawurlencode($string);
?>

$json:
<img src="img/map/<?=$json?>_map.PNG"/ width="600">
$html:
<img src="img/map/<?=$html?>_map.PNG"/ width="600">
$htmlent:
<img src="img/map/<?=$htmlent?>_map.PNG"/ width="600">
$escape:
<img src="img/map/<?=$escape?>_map.PNG"/ width="600">
$urlenc:
<img src="img/map/<?=$urlenc?>_map.PNG"/ width="600">

выход:

$json:
<img src="img/map/"ST JOHN'S"_map.PNG"/ width="600">
$html:
<img src="img/map/ST JOHN&#039;S_map.PNG"/ width="600">
$htmlent:
<img src="img/map/ST JOHN&#039;s_map.PNG"/ width="600">
$escape:
<img src="img/map/ST JOHN\'S_map.PNG"/ width="600">
$urlenc:
<img src="img/map/ST%20JOHN%27S_map.PNG"/ width="600">
0 голосов
/ 04 ноября 2010

«rawurlencode» - это то, что вам нужно, чтобы символы в URL интерпретировались одинаково в запросе «img / map / ...» так же, как в этом сценарии PHP. Кстати, «rawurlencode» безопасно экранирует все символы, о которых вам нужно беспокоиться при инъекциях XSS.

<?php
    $string   = "ST JOHN'S";
    $json     = json_encode($string);
    $html     = htmlspecialchars($string, ENT_QUOTES);
    $htmlent  = htmlentities($string, ENT_QUOTES);
    $escape   = str_replace("'", "\'", $string);
    $urlenc   = rawurlencode($string);
?>

  <script type="text/javascript">
      alert('<?php echo $html; ?>');
      alert('<?php echo $htmlent; ?>');
      alert('<?php echo $urlenc; ?>');
  </script>
...