Как избежать строки из PHP для JavaScript? - PullRequest
12 голосов
/ 17 августа 2011

позволяет представить редактор форм, который может редактировать доступные значения.Если данные содержат символ " (двойная кавычка), он «уничтожает» HTML-код.Я имел в виду, давайте проверим код: поэтому я генерирую HTML:

onclick="var a = prompt('New value: ', '<?php echo addslashes($rec[$i]); ?>'); if (a != null)....

, и это приводит к

onclick="var a = prompt('New value: ', 'aaaa\"aaa'); if (a != null) { v....

, и это делаетРабота JS невозможна, так что это портит код.С одним qoute ' все работает нормально.mysql real escape делает то же самое.Как избежать любой строки, чтобы она не испортила javascript?


json_encode выглядел нормально, но я, должно быть, что-то делаю не так, все равно плохо: вот скриншот, как его видит Firefox - он вставляет"плохая" двойная цитата!Значение является простым числом:

http://img402.imageshack.us/img402/5577/aaaahf.gif

, и я использовал:

('Ird be az új nevet:', <?php echo json_encode($rec['NAME']); ?>); if (a) { 

Ответы [ 4 ]

23 голосов
/ 17 августа 2011

Значение атрибута onclick следует экранировать, как и любой другой атрибут HTML, используя htmlspecialchars(). Фактические строки Javascript внутри кода должны быть закодированы с использованием json_encode(). Например:

<?php
$message = 'Some \' problematic \\ chars " ...';
$jscode = 'alert('.json_encode($message).');';
echo '<a onclick="' . htmlspecialchars($jscode) . '">Click me</a>';

При этом атрибуты onclick (или любого другого события) соответствуют 2005 году. Сделайте себе одолжение и отделите свой код javascript от своего HTML-кода, предпочтительно от внешнего файла, и присоедините события, используя функции DOM (или jQuery). , что красиво оборачивает)

1 голос
/ 17 августа 2011
...onclick="new_func();"...
<script>
function new_func() {
    var a = prompt('new value:','<?php code; ?>');
    if (a) { <!--javascript code--> } else { <!--javascript code--> }
}
</script>
1 голос
/ 17 августа 2011
onclick="var a = prompt('New value: ', 'aaaa\"aaa'); if (a != null) { v....

Ваша проблема выделена жирным шрифтом. Вы не можете заключить в кавычки объявление переменной вам не нужно избегать двойных кавычек после того, как они будут удалены, поскольку они находятся в одинарных кавычках. Должно выглядеть так -

onclick="newFunc();"
<script>
function newFunc()  {
var a = prompt('New value: ', 'aaaa"aaa'); 
if (a != null) { v....
}
</script>
0 голосов
/ 17 августа 2011

Я просто переписываю то, что @Marshall House говорит здесь, но:

В HTML двойная кавычка (") всегда завершает атрибут независимо от обратной косой черты - поэтому он видит: onclick="var a = prompt('New value: ', 'aaaa\". Решение, которое предлагает @Marshall, состоит в том, чтобы отделить ваш код на функция. Таким образом, вы можете без проблем вывести в нее экранированный PHP.

например:.

<script>
    // This is a function, wrapping your code to be called onclick.
    function doOnClickStuff() {
        // You should no longer need to escape your string. E.g.:
        //var a = prompt('new value:','<?php echo $rec[$i]; ?>');
        // Although the following could be safer
        var a = prompt('new value:',<?php json_encode($rec[$i]); ?>);
        if (a) { <!--javascript code--> }
        else { <!--javascript code--> }
    }
</script>
<someelement onclick="doOnClickStuff();"> <!-- this calls the javascript function doOnClickStuff, defined above -->
...