Правильное использование кавычек для вывода JavaScript в переменную - PullRequest
0 голосов
/ 28 мая 2009

Я создаю фрагмент HTML / JavaScript с кодом ниже:

$result = mysql_query("SELECT * FROM posts WHERE userid = '$user_id' ORDER BY DATE desc LIMIT 5")or die (mysql_error());

while ($row = mysql_fetch_array($result))
{

    $source = $row[source];
    $source = "'$source'";

    $p = $p.'<div id="red-div"><div id="smartass"><div id="image"><img src="thumbs/'.$user_image.'" /></div><div id="playsong"><a href="#" onclick="playsong(';
    $p = p.$source;
    $p = $p.'); return false;"><img src="play.png" width="16" height="16" border="0" /></a>'.$row[artist].' - '.$row[title].'</div></div><div id="post-comment">'.$row[comment].'</div><div id="post-date">'.$row[date].'</div></div><div id="dotted-line"></div>';

}

Затем я обновляю часть своей страницы следующим кодом:

parent.document.getElementById('posts').innerHTML = '<?php echo $p; ?>';

По какой-то причине, независимо от того, как я цитирую или введите $source в playsong(''); Я теряю '' в playsong();, в результате чего получается что-то вроде playsong(theSongVariable);, и это, конечно, не работает.

Как правильно указать или вывести '', чтобы убедиться, что они остаются в playsong('');?

Ответы [ 4 ]

3 голосов
/ 28 мая 2009

Если возможно, вы должны использовать json_encode для создания объявления строки JavaScript и htmlspialchars для использования его в качестве значения атрибута HTML:

$onclick = 'playsong('.json_encode($row['source']).'); return false';
$p .= '<div id="red-div"><div id="smartass"><div id="image"><img src="thumbs/'.htmlspecialchars($user_image).'" /></div>';
$p .= '<div id="playsong"><a href="#" onclick="'.htmlspecialchars($onclick).'"><img src="play.png" width="16" height="16" border="0" /></a>';
$p .= htmlspecialchars($row[artist].' - '.$row[title]).'</div></div>';
$p .= '<div id="post-comment">'.htmlspecialchars($row['comment']).'</div>';
$p .= '<div id="post-date">'.$row['date'].'</div></div><div id="dotted-line"></div>';

Да, и Идентификаторы должны быть уникальными в документах .

1 голос
/ 28 мая 2009

Существуют различные способы экранирования строк в зависимости от контекста, в котором вы их используете.

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

echo json_encode(htmlspecialchars($p, ENT_QUOTES, *your charset*));

htmlspecialchars помогает вам избегать последовательностей HTML, чтобы у вас не было таких прикольных вещей, как </script> в части Javascript.

json_encode гарантирует, что ваша строка допустима как последовательность JavaScript.

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

Поскольку мы обсуждаем эту тему, убедитесь, что ваш $ user_id является проверенным значением, поскольку в противном случае вы уязвимы для SQL-инъекции . Например, $ user_id может быть «1» ИЛИ «1» = «1».

Hth

1 голос
/ 28 мая 2009

Вы пытались использовать функцию addlashes в вашей строке $ p. Я думаю, что его основная цель связана с созданием запросов к базам данных, но это может работать и в вашем случае.

0 голосов
/ 28 мая 2009

изменить: также не должен

$p = p.$source;

быть

$p = $p.$source;

Кстати, не забудьте, что вы можете использовать оператор. =. как

$p .= $source;

edit2: попробуйте вывести ваш $ p для анализа, используя (изменится <на & lt; </p>

echo htmlspecialchars($p);

Отредактировано для удаления строки JS. явно не выводится из блока <? php?>. (должен был сначала выпить кофе)

...