echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(".$nam.");return false;'>".$nam."</a></font>";
我想知道在上面的代碼中是否有語法錯誤。我不認爲alert()被調用。Javascript通過PHP回顯
謝謝!
echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(".$nam.");return false;'>".$nam."</a></font>";
我想知道在上面的代碼中是否有語法錯誤。我不認爲alert()被調用。Javascript通過PHP回顯
謝謝!
讓我們說,你有
$nam = 'test';
... your code
這會打印出:
'javascript:alert(test); return false;'
也就是說,它正試圖打印出一個JavaScript變量例如「測試」,從未初始化。
你需要有:
'javascript:alert(\"".$nam."\"); return false;'
現在幾個建議:
獲得了良好的JavaScript調試器,如Firefox的Web開發工具欄或螢火蟲。您可以立即看到問題。
請勿使用'javascript:'decleration。它已被棄用且不必要。
使用onclick,而不是onClick。 與字體和顏色屬性一樣,字體標籤已棄用。 關閉您的標籤(< br/> vs <br>)。
請勿注入javascript,php和html。我強烈建議你使用模板。 。
如果使用弱引號(」,而不是「),PHP將插值引號內的變量你不必來連接這些相當於:
echo "javascript:alert('".$nam."');";
echo "javascript:alert('$nam');";
alert()
以字符串作爲參數。逃脫雙引號來做到這一點:\"
echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(\"".$nam."\");return false;'>".$nam."</a></font>";
除了什麼tandu說:
echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(".$nam.");return false;'>".$nam."</a></font>";
你真的讓你的生活很難這裏由PHP,HTML,樣式,腳本混合在一起了,裏面的JavaScript字符串文字。
每次你把一種Ø f字符串內的另一種字符串,你需要一種逃避類型,否則字符串可以突破其上下文。例如,考慮如果$nam
包含單引號或雙引號會發生什麼情況。在你處理的數據是用戶提交的情況下,這不僅僅是一個bug,而是一個XSS安全漏洞。
每次在HTML中插入文本字符串時,都需要使用htmlspecialchars()
。每次將文本字符串插入到JavaScript文字中時,都需要反斜槓 - 將其轉義。 addslashes()
幾乎不夠好。 json_encode()
要好得多,因爲它可以將任何合適的PHP值轉換爲JavaScript文本,而不僅僅是字符串,並且是包含引號的完整文字,因此您不必添加它們。所以:
echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='alert(".htmlspecialchars(json_encode($nam)).");return false;'>".htmlspecialchars($nam)."</a></font>";
這當然是一個難以理解的混亂。讓我們分離每個層來簡化,並使用PHP本身來完成,而不是試圖繞開HTML字符串。 PHP是一種模板語言,你不妨使用它!
<style type="text/css">
#alerter {
display: block;
color: blue;
font-family: "Segoe UI", sans-serif;
}
</style>
...
<a id="alerter" href="#">
<?php echo htmlspecialchars($nam); ?>
</a>
...
<script type="text/javascript">
document.getElementById('alerter').onclick= function() {
alert(<?php echo json_encode($nam); ?>);
return false;
};
</script>
這很容易處理,並且很容易擴展到一次樣式和腳本很多類似的鏈接。您也可以從DOM中獲取$nam
的值,以避免必須聲明兩次,一次使用HTML,一次使用JS。您還可以使用短名稱來定義函數,以避免必須輸入htmlspecialchars()
和json_encode()
這麼多。
<?php
function h($s) {
echo htmlspecialchars($s, ENT_QUOTES, 'utf8');
}
?>
<style type="text/css">
.alerter {
display: block;
color: blue;
font-family: "Segoe UI", sans-serif;
}
</style>
...
<a class="alerter" href="#"><?php h($nam); ?></a>
<a class="alerter" href="#"><?php h($nam2); ?></a>
...
<script type="text/javascript">
for (var i= document.links.length; i-->0;)
if (document.links[0].className==='alerter')
document.links[0].onclick= function() {
alert(this.firstChild.data);
return false;
};
</script>
這是'不顯眼的腳本'的例子。
+1用於指出所有其他小(大)的東西 – BoltClock 2010-10-09 06:46:15
謝謝,它總是小事。 – 2010-10-09 06:48:14