防止遠程提交表單是一個防止黑客非法遠程提交數據來給我們網站造成安全,下面我來介紹在php中防止遠程非法提交表單實例。
具體方法
一、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
%>