zoukankan      html  css  js  c++  java
  • 利用图片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>


  • 相关阅读:
    模拟器安装.apk包_夜神模拟器
    SDK安装报错_2019
    Jenkins安装插件方法
    Jenkins安装
    Python项目第三方库安装_pip freeze命令
    深入理解Java虚拟机—内存分配
    深入理解Java虚拟机—垃圾回收 下
    深入理解Java虚拟机—垃圾回收 上
    深入理解Java虚拟机—OutOfMemoryError异常
    深入理解Java虚拟机—Java内存区域
  • 原文地址:https://www.cnblogs.com/fdipzone/p/3715093.html
Copyright © 2011-2022 走看看