Escape скобки на PHP для JavaScript - PullRequest
0 голосов
/ 04 сентября 2010

Например, у меня есть PHP-скрипт с таким содержанием:

<?php
$msg = addslashes("I'm a message. The what happened >:(");
echo "<script>alert($msg); return false;</script>";
?>

Но предупреждение прерывается последним "(". Как я могу решить эту проблему?

Ответы [ 5 ]

6 голосов
/ 05 сентября 2010

Вы должны заключить alert параметр в кавычки:

echo "<script>alert('$msg'); return false;</script>";

Что ваш код выводит в браузер:

<script>alert(The what happened >:(); return false;</script>

, который не является допустимым javascript, после помещения кавычек становится:

<script>alert('The what happened >:('); return false;</script>

, который является допустимым JavaScript.

2 голосов
/ 05 сентября 2010

Другие ответы в правой части, , но недостаточно просто заключать в кавычки строку, если это может быть любая произвольная строка. Если сама строка содержит кавычку, обратную косую черту или символ новой строки, это нарушит строковый литерал JavaScript. Если строка содержит </script (или просто </ в некоторых случаях), это сломает блок <script>. В любом случае, если вводится пользовательский ввод, это дает вам большую старую дыру в безопасности межсайтового скриптинга.

Хотя вам может и не понадобиться это для конкретного значения $msg, неплохо бы привыкнуть к экранированию JS-string-literal-любого текста, который вы выводите в строку JS. Хотя вы можете сделать это вручную, добавив обратную косую черту, обычно гораздо проще просто использовать встроенный кодер JSON, который будет работать для других типов, таких как массивы и объекты, а также строки.

<script type="text/javascript">
    alert(<?php echo json_encode($msg); ?>);
    return false; // huh? return, in a <script> block??
</script>
2 голосов
/ 05 сентября 2010

Вам нужно поместить его в строку JavaScript, в противном случае он интерпретируется следующим образом, что бессмысленно и вызывает ошибку:

<script>alert(The what happened >:(); return false;</script>

Обратите внимание на одинарные кавычки в вызове alert(), которые обозначают строку JavaScript (также работают двойные кавычки):

<?php
$msg = "The what happened >:(";
echo "<script>alert('$msg'); return false;</script>";
?>

Также неплохо бы избежать содержимого внутри, чтобы смягчить XSS, используя htmlspecialchars().

0 голосов
/ 05 сентября 2010

alert() принимает строковый аргумент; Вы должны заключить текст, который вы передаете ему, в кавычки (одинарные или двойные) и убедиться, что любые совпадающие кавычки в строке не имеют обратной косой черты.

В вашем случае достаточно одинарных кавычек:

echo "<script>alert('$msg'); return false;</script>";
0 голосов
/ 05 сентября 2010

В зависимости от контекста, вы также можете просто сделать:

<?php
    $msg = "The what happened >:(";
?>

<script>alert("<?php echo $msg ?>"); return false;</script>

Если нет необходимости отображать код HTML или JavaScript, не делайте этого. Это проще в обслуживании.

...