确保 PHP 应用程序的安全八

远程表单提交

Web 的好处是可以分享信息和服务。坏处也是可以分享信息和服务,因为有些人做事毫无顾忌。

以表单为例。任何人都能够访问一个 Web 站点,并使用浏览器上的 File > Save As 建立表单的本地副本。然后,他可以修改 action 参数来指向一个完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因为表单在这个站点上),做他希望的任何修改,点击 Submit,服务器会把这个表单数据作为合法通信流接收。

首先可能考虑检查 $_SERVER['HTTP_REFERER'],从而判断请求是否来自自己的服务器,这种方法可以挡住大多数恶意用户,但是挡不住最高明的黑客。这些人足够聪明,能够篡改头部中的引用者信息,使表单的远程副本看起来像是从您的服务器提交的。

处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。

要创建随机的令牌,可以使用 PHP 内置的 md5()uniqid()rand() 函数,如下所示:


清单 18. 防御远程表单提交

<? 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 >  

这种技术是有效的,这是因为在 PHP 中会话数据无法在服务器之间迁移。即使有人获得了您的 PHP 源代码,将它转移到自己的服务器上,并向您的服务器提交信息,您的服务器接收的也只是空的或畸形的会话令牌和原来提供的表单令牌。它们不匹配,远程表单提交就失败了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值