Pro PHP Programing之安全白名单和黑名单

白名单和黑名单

对于include或者require函数的调用,不应该使用$_GET或$_POST值,因为尚不知晓文件名称。攻击者试图通过为文件名添加…/…/之类的前缀绕过文档根目录的权限控制。对于include或require调用中的变量,应该使用可接受文件名的白名单或净化文件名。

注意:白名单是包含获准项的列表,黑名单则是包含禁止项的列表。白名单比黑名单更加严格,因为它们具体指定了获准项,黑名单则需要不断更新才能有效。

白名单的例子有可接受的电子邮件地址、域名或者HTML标签。黑名单的例子有禁用的电子邮件地址、域名或HTMl标签。

【示例】:使用可接受文件名的白名单限制include文件

<?PHP
       //允许使用文件名的白名单
       $allow_includes = array('fish.php','dogs.php','cat.php');
       if(isset($_GET['animal'])){
              $animal = $_GET['animal'];
              $animal_file = $animal.'.php';
              if(in_array($animal_file,$allow_includes)){
                     require_once($animal_file);
              }else{
                     echo "Error:illegal animal file";
              }
       }
      
?>


对于此脚本打开的文件,basename函数用于确保引用的文件不在文件根目录之外。

对于用户申请的和使用file_get_contents获取的外部URL,必须过滤文件名。可以使用parse_url函数抽取URL并丢弃查询字符串,或者使用FILTER_SANITIZE_URL和FILTER_VALIDATE_URL以确保URL合法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值