개발 꿀팁/PHP

이미지 Etag를 이용한 사용자 판단

Jammie 2022. 8. 19. 14:42
반응형

원리:Javascript,SESSION,COOKIES,FLASH를 사용하지 않습니다.
이미지 Etag를 이용한 사용자 식별
1.사용자의 REMOTE_ADDR과 HTTP_U에 따라SER_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="width:450px;height:150px"><?=$txt ?></textarea></p>
  <p><input type="submit" value="제출하다"></P>
  <input type="hidden" name="send" value="1">
  </form>
 </body>
</html>

 

반응형