确保 PHP 应用程序的安全七

浏览器内的数据操纵

有一类浏览器插件允许用户篡改页面上的头部元素和表单元素。使用 Tamper Data(一个 Mozilla 插件),可以很容易地操纵包含许多隐藏文本字段的简单表单,从而向 PHP 和 MySQL 发送指令。

用户在点击表单上的 Submit 之前,他可以启动 Tamper Data。在提交表单时,他会看到表单数据字段的列表。Tamper Data 允许用户篡改这些数据,然后浏览器完成表单提交。

让我们回到前面建立的示例。已经检查了字符串长度、清除了 HTML 标记并删除了十六进制字符。但是,添加了一些隐藏的文本字段,如下所示:


清单 17. 隐藏变量

<? php
if  ( $_POST [ ' submit ' ==   " go " ){
    
// strip_tags
     $name   =   strip_tags ( $_POST [ ' name ' ]);
    
$name   =   substr ( $name , 0 , 40 );
    
// clean out any potential hexadecimal characters
     $name   =  cleanHex( $name );
    
// continue processing....
}

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 = " table "  value = " users " />
< input type = " hidden "  name = " action "  value = " create " />
< input type = " hidden "  name = " status "  value = " live " />
< p >< input type = " submit "  name = " submit "  value = " go " /></ p >
</ form >  

注意,隐藏变量之一暴露了表名:users。还会看到一个值为 createaction 字段。只要有基本的 SQL 经验,就能够看出这些命令可能控制着中间件中的一个 SQL 引擎。想搞大破坏的人只需改变表名或提供另一个选项,比如 delete

图 1 说明了 Tamper Data 能够提供的破坏范围。注意,Tamper Data 不但允许用户访问表单数据元素,还允许访问 HTTP 头和 cookie。


图 1. Tamper Data 窗口
Tamper Data 窗口

要防御这种工具,最简单的方法是假设任何用户都可能使用 Tamper Data(或类似的工具)。只提供系统处理表单所需的最少量的信息,并把表单提交给一些专用的逻辑。例如,注册表单应该只提交给注册逻辑。

如果已经建立了一个通用表单处理函数,有许多页面都使用这个通用逻辑,那该怎么办?如果使用隐藏变量来控制流向,那该怎么办?例如,可能在隐藏表单变量中指定写哪个数据库表或使用哪个文件存储库。有 4 种选择:

  • 不改变任何东西,暗自祈祷系统上没有任何恶意用户。
  • 重写功能,使用更安全的专用表单处理函数,避免使用隐藏表单变量。
  • 使用 md5() 或其他加密机制对隐藏表单变量中的表名或其他敏感信息进行加密。在 PHP 端不要忘记对它们进行解密。
  • 通过使用缩写或昵称让值的含义模糊,在 PHP 表单处理函数中再对这些值进行转换。例如,如果要引用 users 表,可以用 u 或任意字符串(比如 u8y90x0jkL)来引用它。

后两个选项并不完美,但是与让用户轻松地猜出中间件逻辑或数据模型相比,它们要好得多了。

现在还剩下什么问题呢?远程表单提交。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值