웹의 장점은 정보와 서비스를 공유할 수 있다는 점입니다. 단점은 어떤 사람들은 양심의 가책도 없이 일을 하기 때문에 정보와 서비스를 공유한다는 것입니다.
양식을 예로 들어보겠습니다. 누구나 웹 사이트를 방문하고 브라우저에서 파일 > 다른 이름으로 저장을 사용하여 양식의 로컬 복사본을 만들 수 있습니다. 그런 다음 그는 완전한 URL(formHandler.php가 아니라 양식이 이 사이트에 있으므로 http://www.yoursite.com/formHandler.php)을 가리키도록 작업 매개변수를 수정하고 원하는 작업을 수행할 수 있습니다. 수정 사항이 있는 경우 제출을 클릭하면 서버는 법적 통신 흐름으로 이 양식 데이터를 수신하게 됩니다.
먼저 $_SERVER['HTTP_REFERER']를 확인하여 요청이 자신의 서버에서 오는지 확인하는 것이 좋습니다. 이 방법은 대부분의 악의적인 사용자를 차단할 수 있지만 가장 정교한 해커는 차단할 수 없습니다. 이 사람들은 양식의 원격 복사본이 서버에서 제출된 것처럼 보이도록 헤더의 참조 정보를 조작할 만큼 똑똑합니다.
원격 양식 제출을 처리하는 더 좋은 방법은 고유한 문자열이나 타임스탬프를 기반으로 토큰을 생성하고 이 토큰을 세션 변수와 양식에 넣는 것입니다. 양식을 제출한 후 두 토큰이 일치하는지 확인하세요. 일치하지 않으면 누군가가 양식의 원격 복사본에서 데이터를 보내려고 하는 것입니다.
무작위 토큰을 생성하려면 아래와 같이 PHP에 내장된 md5(), uniqid() 및 rand() 함수를 사용할 수 있습니다.
<span style="font-size: small;"><?php session_start(); if ($_POST['submit'] == "go"){ //check token if ($_POST['token'] == $_SESSION['token']){ //strip_tags $name = strip_tags($_POST['name']); $name = substr($name,0,40); //clean out any potential hexadecimal characters $name = cleanHex($name); //continue processing.... }else{ //stop all processing! remote form posting attempt! } } $token = md5(uniqid(rand(), true)); $_SESSION['token']= $token; function cleanHex($input){ $clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input); return $clean; } ?> <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"> <p><label for="name">Name</label> <input type="text" name="name" id="name" size="20" maxlength="40"/></p> <input type="hidden" name="token" value="<?php echo $token;?>"/> <p><input type="submit" name="submit" value="go"/></p> </form> </span>
이 기술은 효과적입니다. PHP에서는 서버 간에 세션 데이터를 마이그레이션할 수 없습니다. 누군가 귀하의 PHP 소스 코드를 획득하여 자신의 서버로 이동하고 귀하의 서버에 정보를 제출하더라도 귀하의 서버는 모두 비어 있거나 잘못된 형식의 세션 토큰과 원래 제공된 양식 토큰만 받게 됩니다. 일치하지 않으며 원격 양식 제출이 실패합니다.