防止遠程提交表單是一個防止黑客非法遠程提交數據來給我們網站造成安全,下面我來介紹在php中防止遠程非法提交表單實例.
具體方法
一、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("警告!你正在從外部提交數據!!請立即終止?。?quot;);
- exit;
- }
- ?>
把以上代碼放到需要防止外部提交數據的頁面中,如果是直接輸入網址或者是從外部網部鏈接到本頁,則顯示:警告!你正在從外部提交數據,請立即終止,如果系從本站鏈接或通過表單提交到該頁,則無此提示,這樣做主要是為了防止一些偽造表單向站內提交數據 .
上面的代碼通過curl可直接跳過了,我們可以參考dz論壇登錄的一種做法.
處理遠程表單提交更好的方式是,根據一個惟一的字符串或時間戳生成一個令牌,并將這個令牌放在會話變量和表單中,提交表單之后,檢查兩個令牌是否匹配,如果不匹配,就知道有人試圖從表單的遠程副本發送數據.
要創建隨機的令牌,可以使用 PHP 內置的 md5()、uniqid() 和 rand() 函數,如下代碼:
- <?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;
- }
- ?>
- //開源代碼Vevb.com
- <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>
沒事把以前寫的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
- %>
新聞熱點
疑難解答