echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';
Ahh. Değişmez bir PHP dize içinde, bir HTML kodlanmış niteliği içinde, bir JavaScript dize literal var. Öncelemeli aklını karıştırıyor şaşmamalı.
Peki, ilk: Eğer $row['value']
kaçan olmadan liste öğenin metninde çıktılıyorsanız. Bu değer <
, &
ve "
gibi özel karakterler içeriyorsa, bu sorun (potansiyel güvenlik sorun) demektir. Bu htmlspecialchars()
sarılmış edilmesi gerekmektedir.
Sonra, değişmez bir JavaScript dize şey koyuyorlar. Yine, potansiyel: Bu dize sınırlayıcı karakter '
veya kaçan ters eğik çizgi \
değeri kullanılırsa, bu dize patlak ve sayfanın içine JavaScript kodu enjekte demektir güvenlik sorunu. addslashes()
değişmez bir JS dize eklenmek üzere bir dize kaçmak için kullanılabilir; Hala htmlspecialchars()
sonradan dize literal bir HTML kodlanmış niteliği kendisi iç çünkü var unutmayın.
Yani biz bakıyoruz:
echo "<li onclick=\"fill('".htmlspecialchars(addslashes($row['value']), ENT_QUOTES)."');\">".htmlspecialchars($row['value']).'</li>';
Çok okunabilir değil, değil mi? Peki, biz bu artırabilirsiniz:
Biz (Jonathan tarafından gösterildiği gibi) dizeleri sokmak için PHP'nin kendisi kullanarak literal PHP dize kaybedebilir. PHP çiftleşmiş dili, bundan yararlanmak!
Biz tipik bir şablonda bu fonksiyonunu çok kullanmak gerekir çünkü iyi bir fikir olduğunu, htmlspecialchars
daha kısa bir isimde bir fonksiyon tanımlayabilirsiniz.
Biz JavaScript tarafı liste öğesinin içeriğinden ihtiyacı veri okumak suretiyle JavaScript dize literal önleyebilirsiniz (text()
, jQuery, size kullanıyor görünüyor ne yana), yerine zorunda göre çirkin bir satır içi olay işleyicisi içinde sarın.
Örneğin:
<?php
function h($text) {
echo(htmlspecialchars($text, ENT_QUOTES));
}
?>
<ul id="suggesties">
<?php while ($row= mysql_fetch_array($r)) { ?>
<li><?php h($row['value']); ?></li>
<?php } ?>
</ul>
<script type="text/javascript">
$('#suggesties>li').click(function() {
$('#inputString').val($(this).text());
$('#suggesties').hide();
});
</script>