Наиболее эффективный способ передачи переменных PHP во внешний файл JavaScript (или jQuery)

Я прочитал несколько сообщений по этому вопросу и нашел, что это самое простое решение, вот мой код:

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 и как все это влияет на производительность (время загрузки страницы). Большое спасибо!

О вопросе 1: используйте 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 string

    Изображение адаптировано из json.org

Для полного и хорошо объясненного ответа прочитайте это удивительное Q & A. Короче говоря, оказывается, что <!--<script> в блоке <script> смущает HTML-парсер. PHP действительно правильно выполнил свою работу в json_encode() ; вы просто не можете иметь <!--<script> , хотя это абсолютно допустимая строка JavaScript!

Я сделал несколько простых тестов сам. Браузеры фактически игнорируют все после <!--<script> , поэтому, если это происходит посередине страницы, вся вторая половина страницы ушла! Я не уверен, что кто-то может на самом деле ввести что-то вредоносное, чтобы, скажем, выполнить произвольный код, но это достаточно плохо.

Также,

  • Если у вас есть не только строка в $myVarValue , но и сложный объект, такой как array("key" => array("one", "and<!--<script>two", 3)) , который включает в себя <!--<script> , все равно плохо.
  • Если у вас есть простой HTML-файл (т. Е. Нет PHP), и у вас есть <!--<script> любом месте (даже в комментарии JavaScript) в блоке <script> , это тоже плохо.
  • Если вы используете другие, не-PHP, серверные языки программирования и создаете <!--<script> , это тоже плохо.
  • Если ваш PHP выводит JavaScript напрямую ( 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 не рекомендуется, так как оно имеет массу недостатков, например, здесь , здесь .


О вопросе 2: время загрузки начальной страницы

Собственно, это довольно очевидно. Если время, необходимое для получения значения $myVarValue , длинное (например, вы извлекаете много данных из БД), PHP придется ждать, так же как браузер и пользователь. Это означает более длительное время загрузки начальной страницы. Если вы позже загрузите данные с помощью Ajax, им не придется ждать, чтобы увидеть исходный результат, но тогда вызов Ajax будет дополнительным HTTP-запросом, поэтому это означает большую нагрузку на сервер и большую нагрузку на сервер сеть.

Конечно, каждый метод имеет свои плюсы и минусы, поэтому вы должны решить. Я предлагаю прочитать это отличное Q & A.

Довольно уверен, что это не сломает. Весь смысл json_encode в том, что безопасно сбрасывать.

</script> может сломать его, но PHP escapes / as \/ по умолчанию, поэтому вам не стоит беспокоиться об этом.