2010-10-09 70 views
0
echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(".$nam.");return false;'>".$nam."</a></font>"; 

我想知道在上面的代碼中是否有語法錯誤。我不認爲alert()被調用。Javascript通過PHP回顯

謝謝!

回答

2

讓我們說,你有

$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');"; 
+0

+1用於指出所有其他小(大)的東西 – BoltClock 2010-10-09 06:46:15

+0

謝謝,它總是小事。 – 2010-10-09 06:48:14

0

alert()以字符串作爲參數。逃脫雙引號來做到這一點:\"

echo "<br><font face='Segoe UI' color='blue'><a href='#' onClick='javascript:alert(\"".$nam."\");return false;'>".$nam."</a></font>"; 
+0

謝謝。這工作。雖然,我不完全理解上面的語法。何時使用?我的意思是說你的意思是逃避雙引號? – Anant 2010-10-09 06:48:33

+0

,因爲你現在使用的是PHP,你的'echo'使用雙引號來顯示字符串,顯示一個雙引號,你需要轉義它:'\「'如果你不這樣做,字符串將會終止一旦遇到雙引號,並且會返回一個錯誤 – Ruel 2010-10-09 06:57:37

1

除了什麼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> 

這是'不顯眼的腳本'的例子。