#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");
Это дало бы дополнительное преимущество, позволяющее избежать ошибок из-за разницы часовых поясов между вашим сервером и браузером пользователя.