• 利用图片Etag判断用户


    原理:不使用Javascript,SESSION,COOKIES,FLASH。
                利用图片Etag识别用户
                1.根据用户的 REMOTE_ADDR 与 HTTP_USER_AGENT 生成唯一Etag。
                2.将Etag输出到客户端。
                3.获取 HTTP_IF_NONE_MATCH 判断是否同一个用户访问。

    .htaccess rewrite

    <IfModule mod_rewrite.c>
    
    RewriteEngine On
    
    RewriteRule ^pic.png$ index.php?pic=1 [NC]
    
    </IfModule>

    源码 index.php:
    <?
    define('SECRET', 'j8s91slksd9ab');  // secret
    define('LOG', 'data.log');          // 保存用户数据
    
    // 生成 etag
    function genEtag(){
        if(!empty($_SERVER['HTTP_IF_NONE_MATCH'])){
            $etag = $_SERVER['HTTP_IF_NONE_MATCH'];
        }else{
            $etag = substr(md5(SECRET. substr(md5($_SERVER['REMOTE_ADDR']),0,16). substr(md5($_SERVER['HTTP_USER_AGENT']),0,16)),0, 16);
        }
        return $etag;
    }
    
    // 显示图片
    function showPic($etag){
        header('content-type:image/png');
        header('Etag:'.$etag);
    
        $im = imagecreate(1, 1); // 生成1x1px的透明图片
        imagecolorallocatealpha($im, 0, 0, 0, 127);
        imagepng($im);
        imagedestroy($im);
    
        exit();
    }
    
    // 获取存储的数据
    function getData(){
        $logdata = file_exists(LOG)? file_get_contents(LOG) : '';
        if(!$logdata){
            $data = array();
        }else{
            $data = json_decode($logdata, true);
        }
        return $data;
    }
    
    $etag = genEtag();
    
    $pic = isset($_GET['pic'])? $_GET['pic'] : 0;
    if($pic==1){
        showPic($etag);
    }
    
    $data = getData();
    
    // 提交表单
    $send = isset($_POST['send'])? $_POST['send'] : 0;
    
    if($send==1){
        $txt = isset($_POST['txt'])? $_POST['txt'] : '';
        if($txt!=''){
            $data[$etag] = $txt;
            file_put_contents(LOG, json_encode($data),true);
        }
    }
    
    $txt = isset($data[$etag])? $data[$etag] : ''; // 用户输入的数据
    ?>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
     <head>
      <meta http-equiv="content-type" content="text/html; charset=utf-8">
      <title> PIC ETAG </title>
     </head>
    
     <body>
      <img src="pic.png">
      <form method="post" action="index.php">
      <p>请填写讯息:</p>
      <p><textarea name="txt" style="450px;height:150px"><?=$txt ?></textarea></p>
      <p><input type="submit" value="提交"></P>
      <input type="hidden" name="send" value="1">
      </form>
     </body>
    </html>


  • 相关阅读:
    对于Python中self的看法
    SpringBoot整合MyBatis-Plus快速开始
    Hive原理--体系结构
    Docker Compose + Traefik v2 快速安装, 自动申请SSL证书 http转https 初次尝试
    记录:更新VS2019后单元测试运行卡住无法运行测试的问题。
    黑帽来源页劫持代码以及如何防范
    OFFICE 2010 每次打开提示安装的问题
    Mssql 查询某记录前后N条
    验证邮箱正则表达式,包含二级域名邮箱,手机号正则表达式支持170号段
    删除TFS上的团队项目
  • 原文地址:https://www.cnblogs.com/fdipzone/p/3715093.html
Copyright © 2020-2023  润新知