반응형
원리: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>
반응형
'개발 꿀팁 > PHP' 카테고리의 다른 글
php HTTP 요청 클래스, GET, POST, Multipart/form-data 지원 (0) | 2022.08.19 |
---|---|
php fsockopen GET/POST를 이용한 양식 제출 및 파일 업로드 (0) | 2022.08.19 |
php output_buffering 캐시 사용 (0) | 2022.08.19 |
동일한 도메인이 서로 다른 IP에 대응하여 지정된 호스트 파일의 내용에 접근하는 방법 (0) | 2022.08.19 |
php 변수의 이름을 가져오는 방법 (0) | 2022.08.19 |