Я прочитал несколько сообщений по этому вопросу и нашел, что это самое простое решение, вот мой код:
js внутри PHP- кода
<script> <!--// var jsBaseurl = <?php echo json_encode(BASE_URL."/"); ?>; var jsTitle = <?php echo json_encode($h1_title); ?>; var jsSubtl = <?php echo json_encode($h2_title);?>; //--> </script> <script src="external.js"></script>
и внешний .js
var siteURL=jsBaseurl; alert(siteURL+jsTitle+jsSubtl)
он отлично работает, мой вопрос касается следующих комментариев Pang and biplav :
ПРЕДУПРЕЖДЕНИЕ: Это может убить ваш сайт. Пример:
<?php $myVarValue = '<!--<script>'; ?>
См. Этот вопрос для деталей. Решение. Используйте JSON_HEX_TAG для выхода из <и> (требуется PHP 5.3.0). – Панг
Другим недостатком этого является то, что это влияет на время загрузки самой страницы. – biplav
Я хотел бы знать простое решение для комментария Pang и как все это влияет на производительность (время загрузки страницы). Большое спасибо!
JSON_HEX_TAG
в json_encode()
Пример 1
Рассмотрим этот простой фрагмент кода.
<script> <?php $myVarValue = 'hello world'; ?> var myvar = <?php echo json_encode($myVarValue); ?>; alert(myvar); </script>
Вывод:
<script> var myvar = "hello world"; alert(myvar); </script>
Он оповещает hello world
. Хорошо.
Пример 2.
Попробуем использовать </script>
как строку.
<script> <?php $myVarValue = '</script>'; ?> var myvar = <?php echo json_encode($myVarValue); ?>; alert(myvar); </script>
Вывод:
<script> var myvar = "<\/script>"; alert(myvar); </script>
Он предупреждает </script>
. Хорошо.
Как вы можете видеть, слэш ( /
) правильно экранируется как \/
,
Пример 3.
Теперь рассмотрим эту особую строку: <!--<script>
<script> <?php $myVarValue = '<!--<script>'; ?> var myvar = <?php echo json_encode($myVarValue); ?>; alert(myvar); </script>
Вывод:
<script> var myvar = "<!--<script>"; alert(myvar); </script>
Удивительно, но ничего не предупреждает, и в консоли ошибок ничего нет. Какие?!
Если вы проверяете спецификацию JSON, ни один из символов в <!--<script>
должен быть экранирован, поэтому что пошло не так?
Изображение адаптировано из json.org
Для полного и хорошо объясненного ответа прочитайте это удивительное Q & A. Короче говоря, оказывается, что <!--<script>
в блоке <script>
смущает HTML-парсер. PHP действительно правильно выполнил свою работу в json_encode()
; вы просто не можете иметь <!--<script>
, хотя это абсолютно допустимая строка JavaScript!
Я сделал несколько простых тестов сам. Браузеры фактически игнорируют все после <!--<script>
, поэтому, если это происходит посередине страницы, вся вторая половина страницы ушла! Я не уверен, что кто-то может на самом деле ввести что-то вредоносное, чтобы, скажем, выполнить произвольный код, но это достаточно плохо.
Также,
$myVarValue
, но и сложный объект, такой как array("key" => array("one", "and<!--<script>two", 3))
, который включает в себя <!--<script>
, все равно плохо. <!--<script>
любом месте (даже в комментарии JavaScript) в блоке <script>
, это тоже плохо. <!--<script>
, это тоже плохо. Content-type: application/javascript
), на самом деле это нормально [1] . Решение ? Используйте JSON_HEX_TAG
для выхода из <
и >
(требуется PHP 5.3.0).
<script> <?php $myVarValue = '<!--<script>'; ?> var myvar = <?php echo json_encode($myVarValue, JSON_HEX_TAG); ?>; // ^^^^^^^^^^^^^^ alert(myvar); </script>
Вывод:
<script> var myvar = "\u003C!--\u003Cscript\u003E"; alert(myvar); </script>
Он предупреждает <!--<script>
. Ура!
Это работает, потому что в выводе больше нет <!--<script>
, поэтому больше нет проблем с анализом HTML.
Примечание: вам не нужен JSON_HEX_TAG
если вы не печатаете в блок <script>
.
[1] Здесь «ok» просто означает, что он свободен от проблемы <!--<script>
. Динамическое создание внешних файлов JavaScript не рекомендуется, так как оно имеет массу недостатков, например, здесь , здесь .
Собственно, это довольно очевидно. Если время, необходимое для получения значения $myVarValue
, длинное (например, вы извлекаете много данных из БД), PHP придется ждать, так же как браузер и пользователь. Это означает более длительное время загрузки начальной страницы. Если вы позже загрузите данные с помощью Ajax, им не придется ждать, чтобы увидеть исходный результат, но тогда вызов Ajax будет дополнительным HTTP-запросом, поэтому это означает большую нагрузку на сервер и большую нагрузку на сервер сеть.
Конечно, каждый метод имеет свои плюсы и минусы, поэтому вы должны решить. Я предлагаю прочитать это отличное Q & A.
Довольно уверен, что это не сломает. Весь смысл json_encode
в том, что безопасно сбрасывать.
</script>
может сломать его, но PHP escapes /
as \/
по умолчанию, поэтому вам не стоит беспокоиться об этом.