具體方法
一、PHP防止站外提交資料的方法
代碼如下 |
複製代碼 |
<? $servername=$HTTP_SERVER_VARS['SERVER_NAME']; $sub_from=$HTTP_SERVER_VARS["HTTP_REFERER"]; $sub_len=strlen($servername); $checkfrom=substr($sub_from,7,$sub_len); if($checkfrom!=$servername){ echo("警告!你正在從外部提交資料!!請立即終止!!"); exit; } ?> |
把以上代碼放到需要防止外部提交資料的頁面中,如果是直接輸入網址或者是從外部網部連結到本頁,則顯示:警告!你正在從外部提交資料!!請立即終止!!;如果系從本站連結或通過表單提交到該頁,則無此提示。這樣做主要是為了防止一些偽造表單向站內提交資料 。
上面的代碼通過curl可直接跳過了,我們可以參考dz論壇登入的一種做法
處理遠端資料表單提交更好的方式是,根據一個惟一的字串或時間戳記產生一個令牌,並將這個令牌放在會話變數和表單中。提交表單之後,檢查兩個令牌是否匹配。如果不匹配,就知道有人試圖從表單的遠程副本發送資料。
要建立隨機的令牌,可以使用 PHP 內建的 md5()、uniqid() 和 rand() 函數,如下所示
代碼如下 |
複製代碼 |
<SPAN style="FONT-SIZE: small"><?php session_start(); if ($_POST['submit'] == "go"){ //check token if ($_POST['token'] == $_SESSION['token']){ //strip_tags $name = strip_tags($_POST['name']); $name = substr($name,0,40); //clean out any potential hexadecimal characters $name = cleanHex($name); //continue processing.... }else{ //stop all processing! remote form posting attempt! } } $token = md5(uniqid(rand(), true)); $_SESSION['token']= $token; function cleanHex($input){ $clean = preg_replace("![][xX]([A-Fa-f0-9]{1,3})!", "",$input); return $clean; } ?> <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"> <p><label for="name">Name</label> <input type="text" name="name" id="name" size="20" maxlength="40"/></p> <input type="hidden" name="token" value="<?php echo $token;?>"/> <p><input type="submit" name="submit" value="go"/></p> </form> </SPAN> |
沒事把以前寫的asp寫出來
ASP防止外部提交資料的方法
代碼如下 |
複製代碼 |
<% Server_v1=Cstr(Request.ServerVariables("HTTP_REFERER")) Server_v2=Cstr(Request.ServerVariables("SERVER_NAME")) If mid(server_v1,8,len(server_v2))<>server_v2 then Response.write "警告!你正在從外部提交資料!!請立即終止!!" Response.End End if %> |