2013-07-17 39 views
0

靜態頁面A有一個表單,其動作提交到授權頁面 B這是一個動態頁面。 B授權後,將重定向到回調鏈接 C,由C傳遞給B。PHP與javascript通信

除了重定向到C頁面,B還會發布一些表示auth狀態的參數。 uin是將在頁面C的內容中使用的最重要的參數,即腳本。腳本需要uin稍後發送Ajax請求。問題是如何將uin傳遞給靜態頁面C?

一個快速和骯髒的想法我是一個PHP文件包靜態頁面C,和輸出例如在隱藏div數據:

<?php 
$html = file_get_contents("callback.html") 
$div = "<div stype='display:none' uin={$_POST['uin']}></div>" 
//add this div to $html and print it, need a little more work to figure out how to do this 
?> 

是否有這樣做的更好的辦法,因爲這是有點「白癡」我想...

+0

爲什麼不只是使用位置標頭C與URL參數?我認爲JS可以訪問它們(如果不是的話,你可以把它放在哈希代替之後) –

+0

Typo:'stype' --->'style'。 :-) – Spudley

回答

1

您的代碼:(與stype錯字固定)

$div = "<div style=\"display:none\" uin={$_POST['uin']}></div>"; 

看這段代碼,我可以看到它的最大問題是,你沒有做任何逃脫它輸出$_POST值。

這是潛在的安全威脅;請考慮如果某人提供了發佈到您網站的表單,並將uin值設置爲一串HTML代碼,則會發生什麼情況,從>開始關閉div。他們的代碼將出現在您的網站上,就好像您將它放在那裏一樣。通過一絲小心的造型,他們可以使用這種方式使您的網站看起來和行爲無論他們想要的。不是很好。

您可以通過在html_entities()中包裝$_POST變量來修復該問題,以便在將其輸出到站點時正確轉義。或者,在這種情況下,由於它是(或似乎是)一個數字ID值,因此無論實際的發佈數據包含什麼內容,您都可以簡單地將其轉換爲int以確保它不包含不需要的數據:

$uin = (int)$_POST['uin']; 

...然後在輸出而不是原始數據後使用$uin

我想說的第二點是有效性。 uin不是有效的HTML屬性。它可能工作,但它是無效的。正確的符合標準的方式做自定義屬性的HTML是使用數據屬性,像這樣:

$div = "<div style=\"display:none\" data-uin={$uin}></div>"; 

...即所有自定義屬性的名稱應與data-

這個建議啓動因爲它允許您擁有與真實屬性同名的自定義屬性而不會冒任何風險。例如,您可以擁有data-style,但不會與實際的style屬性發生衝突。

這也意味着HTML規範可以添加新的屬性而不會冒險與其他人的代碼發生衝突。例如,如果未來版本的HTML包含未來瀏覽器用於對元素進行巧妙操作的uin屬性,則會導致代碼出現問題。如果您使用data-uin,則不會發生這些問題。 (好吧,所以uin對於新的標準HTML屬性來說是不太可能的名字,但點的立場)

0

你在你的PHP代碼的語法錯誤,你需要屏蔽周圍的內嵌樣式的報價和你錯過添加一些冒號:

<?php 
$html = file_get_contents("callback.html"); 
$div = "<div style=\"display:none\" uin={$_POST['uin']}></div>"; 
//add this div to $html and print it, need a little more work to figure out how to do this 
echo($html); // print variable $html 
echo($div); // print variable $div 
?> 
0

也許你應該在用戶會話中存儲來自頁面B的參數。與頁面C相比,您可以使用這些參數(在將任何內容輸出到瀏覽器之前調用session_start()之後)。另外,如果您使用的是JavaScript,請考慮將uin放在javascript變量中而不是html div中。像<script type="text/javascript">var uin = 123; </script>