вычисление строки javascript из переменной php, которая содержит математическое выражение (но на самом деле является датой)

#javascript #php

#javascript #php

Вопрос:

У меня есть следующая функция javascript. Функция фактически заполняет средство выбора даты jquery, но для этого вопроса я удалил этот код, поскольку он не был релевантным.

 function PrintDateToConsole() {
    var testDate;

    <?php
        $test_date = date("Y-m-d", time());
        printf("testDate=$test_date;n");
    ?>

    console.log(test_date);
}
  

Результат, который выводится в консоли при запуске этого кода, равен 1978 (сегодняшняя дата 2014-6-30 = 1978).

Почему строка даты вычисляется как математическое выражение и как я могу это предотвратить?

Примечание: я совершенно уверен, что это проблема javascript, а не проблема php, поскольку, когда я просматриваю исходный код на странице, я вижу:

 function PrintDateToConsole() {
    var testDate;
    testDate=2014-06-30;
    console.log(test_date);
}
  

Комментарии:

1. Вы страдаете от PHP / JS эквивалента атаки sql-инъекции: вы выводите текст из одного контекста в другой, не принимая во внимание, как этот текст будет виден принимающим контекстом.

2. Если вы хотите вывести значения PHP в JS, оберните их с помощью json_encode . Вы создадите допустимые и ожидаемые литеральные значения для JS.

Ответ №1:

Заменить:

 printf("testDate=$test_date;n");
  

С:

 printf("testDate='$test_date';n");
  

Дата не передается как строка в JavaScript. Вместо этого вы буквально помещаете ряд чисел с операторами подстроки в свой JS.
Модификация передаст ее как строку, правильно:

 testDate='2014-06-30';
  

Комментарии:

1. бах. да, да, 1000x да. Я перечитал сообщение после публикации (как я всегда делаю), и для меня это тоже было очевидно. Я пошел и протестировал его, и к тому времени, когда я вернулся, вы уже ответили, но мне нужно подождать 15 минут, чтобы принять ваш ответ.

2. Если вы настаиваете на использовании функции вместо языковой конструкции , я бы рекомендовал вам использовать ее по назначению: printf('var testDate = %s;', json_encode($test_date));

Ответ №2:

В JavaScript это вычисление :

 testDate=2014-06-30;
  

Чтобы получить его как дату, вы можете использовать

 printf("testDate=new Date('$test_date');n");
  

Но поскольку вы начинаете с метки времени, нет смысла сначала выполнять форматирование, а затем синтаксический анализ. Вы должны просто сделать

 printf("testDate=new Date(".time().");n");
  

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