站內搜尋

Wednesday, April 18, 2012

[PHP] 讓網頁不被直接連結 (實務應用:只有透過ajax才能向該網頁取得資料)

假如我們想做一個網站,讓使用者只需要訪問index.php這一頁,不需要換頁就可以查到所有他想查詢的資料,我想你這個時候應該已經聯想到,只要透過ajax這個技術就可以達到這個目的。
為了提供index.php各式各樣的動態資料,我們需要產生1.php、2.php...等相關的資料查詢網頁,而這些網頁只負責餵資料給index.php,我們不打算給使用者直接連結,所以,我們可以採取一些保護措施,例如...

開放使用者訪問的index.php程式碼
<?php
$ton=date(n).date(j).date(G);
$md5ton=md5($ton);
$html=<<<asdf
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
//map
$('#mya').live("click",function() {
$('#mydiv').load('1.php?token={$md5ton}');
});
});
</script>
    </head>
    <body>
<a id="mya">click</a>
<div id="mydiv">
</div>
    </body>
</html>
asdf;
echo $html;
?>

負責餵資料的1.php程式碼
<?php//referer驗證
$myurl=$_SERVER['HTTP_HOST'];
$referer=$_SERVER['HTTP_REFERER'];
$referer=parse_url($referer);
$referer=$referer['host'];
//token驗證
$myton=date(n).date(j).date(G);
$myton=$myton-1;
for($i=0;$i<=2;$i++){
$arr_myton[$i]=md5($myton);
$myton++;
}
if(($referer==$myurl) AND (in_array($_GET["token"],$arr_myton))){
echo "PASS!";
}
else{
echo "STOP!";
}
?>
程式碼解說:
我們採取兩個驗證方式,第一個是referer驗證,如果安全性沒有要設定太高,可以只驗證這個。因為referer是可以被偽造的,所以我們再加上第二個動態token驗證,簡單說明一下這個token的概念,就是取得"月日時"再用md5去編碼來當作我們的token,然後丟給1.php,而1.php會再次利用 "月日時" 去產生token(容許前後1小時的誤差),當index.php丟過來的token與1.php自己產生的token相符時,就表示驗證成功。

No comments:

Post a Comment