댓글 목록

PHP 양식 확인

페이지 정보

작성자 운영자 작성일 18-03-13 12:44 조회 1,855 댓글 0

동영상 강좌는 유튜브 채널 '웹학교'를 이용하시기 바랍니다.

이 장과 다음 장에서는 PHP를 사용하여 양식 데이터의 유효성을 검사하는 방법을 보여줍니다.


PHP 양식 확인


이 페이지들은 보안을 염두에 두고 PHP양식을 처리하는 방법을 보여줄 것입니다. 해커 및 스팸 발송자로부터 양식을 보호하려면 양식 데이터의 올바른 확인이 중요합니다.


이 장에서 다루게 될 HTML양식에 사용된 다양한 입력 필드 : 필수 및 선택 텍스트 필드, 라디오 버튼 및 제출 버튼


5ca28a4bc0a7bcb8babf4d738e43507b_1520908198_5955.png
(예: 그누보드5 회원가입 양식)


위의 양식에 대한 유효성 검사 규칙은 다음과 같습니다.


 필드

 유효성 검사 규칙

 아이디

 필수. 영문자, 숫자, _만 입력 가능. 최소 3자이상

 비밀번호

 필수.

 비밀번호 확인

 필수.

 이름

 필수.

 닉네임

 필수. 공백없이 한글,영문,숫자만 입력 가능

 E-mail

 필수.

 전화번호

 선택사항.

 휴대폰번호

 선택사항.

 자동등록방지

 필수.


먼저 다음과 같은 형식의 일반 HTML 코드를 살펴보겠습니다.


텍스트 필드

아이디, 비밀번호, 이름, 닉네임, E-mail, 전화번호, 휴대폰번호는 텍스트 입력요소이고 HTML코드는 다음과 같습니다. (위 그누보드5코드에는 조금 다를 수 있습니다. 디자인적 요소 반영)


아이디 : <input type="text" name="mb_id">

비밀번호 : <input type="text" name="mb_password">

이름: <input type="text" name="mb_name">

닉네임 : <input type="text" name="mb_nicname">

E-mail : <input type="text" name="mb_email">

전화번호: <input type="text" name="mb_tel">

휴대폰번호: <input type="text" name="mb_hp">


양식 요소

양식의 HTML코드는 다음과 같습니다.

<form name="fregisterform" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post" enctype="multipart/form-data">


양식이 제출되면 양식 데이터는 method="post"와 함께 전송됩니다.

$_SERVER["PHP_SELF"]변수는 무엇입니까?

$_SERVER["PHP_SELF"]는 현재 실행중인 스크립트의 파일 이름을 반환하는 슈퍼전역 변수입니다.

따라서 $_SERVER["PHP_SELF"]는 제출된 양식 데이터를 다른 페이지로 이동하는 대신 페이지 자체로 전송합니다. 이렇게 하면 양식과 동일한 페이지에 오류 메시지가 표시될 수 있습니다.

htmlspecialchars()함수란 무엇입니까?

htmlspecialchars()함수는 특수 문자를 HTML엔터티로 변환합니다. 즉 < 과 > 같은 HTML문자를 &lt; 과 &gt로 변환합니다. 이렇게 하면 공격자가 HTML 또는 Javascript코드(교차 사이트 스크립팅 공격)를 양식에 주입하여 코드를 악용할 수 없습니다.

PHP 양식 보안에 대한 중요 사항


해커는 $_SERVER["PHP_SELF"]변수를 사용할 수 있습니다.


여러분의 웹페이지에서 PHP_SELF가 사용되면 사용자는 슬래시(/)를 입력한 후 XSS(Cross Site Scripting)명령을 입력하여 실행할 수 있습니다.


Cross-site scripting(XSS)는 일반적으로 웹 응용 프로그램에서 발견되는 컴퓨터 보안 취약점 유형입니다.

XSS를 사용하면 공격자가 다른 사용자가 본 웹페이지에 클라이언트측 스크립트를 삽입할 수 있습니다.


"test_form.php"페이지에 다음과 같은 형식이 있다고 가정합니다.


<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">


이제 사용자가 "http://www.abc.com/test_form.php"와 같이 검색 주소창에 일반 URL을 입력하면 위 코드가 다음과 같이 번역됩니다.


<form method="post" action="test_form.php">


그러나 사용자가 검색 주소창에 다음 URL을 입력했다고 간주해 보겠습니다.


http://www.abc.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E


이럴 경우 위 코드는 다음과 같이 번역됩니다.


<form method="post" action="test_form.php/"><script>alert('hacked')</script>


이 코드는 스크립트 태그와 경고 명령을 추가합니다. 페이지가 로드되면 Javascript 코드가 실행됩니다(사용자에게 경고 상자가 표시됨). 이것은 PHP_SELF변수가 어떻게 악용될 수 있는지 간단하고 무해(예제에서는 단순히 경고창만 띄우므로)한 예제일 뿐입니다.


<script>태그 안에 모든 Javascript코드를 추가할 수 있습니다. 해커는 사용자를 다른 서버의 파일로 리디렉션할 수 있으며 해당 파일에는 글로벌 변수를 변경하거나 양식을 다른 주소로 제출하여 사용자 데이터를 저장할 수 있는 악성 코드가 들어 있을 수 있습니다.


$_SERVER["PHP_SELF"] 악용을 피하는 방법

$_SERVER["PHP_SELF"]악용은 htmlspecialchars()함수를 사용하면 피할 수 있습니다.


양식 코드는 다음과 같아야 합니다.


<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">


htmlspecialchars()함수는 특수 문자를 HTML엔터티로 변환합니다. 이제 사용자가 PHP_SELF변수를 악용하려고 시도하면 다음과 같은 결과가 출력됩니다.


<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">


악용 시도가 실패하고 해를 끼칠 수 없게 됩니다.


PHP로 양식 데이터 검증


우리가 할 첫 번째 일은 PHP의 htmlspecialchars()함수를 통해 모든 변수를 전달하는 것입니다.

우리가 htmlspecialchars()함수를 사용할 때; 다음 사용자가 텍스트 필드에 다음을 제출하려고 하면:


<script>location.href('http://www.hacked.com')</script>


이것은 다음과 같이 HTML 이스케이프된 코드로 저장되기 때문에 실행되지 않습니다.


&lt;script&gt;location.href('http://www.hacked.com')&lt;/script&gt;


이 코드는 페이지 또는 이메일 내부에 표시하는 것이 안전합니다.


우리는 사용자가 양식을 제출할 때 두 가지 이상의 더 많은 작업을 수행합니다.


1. PHP trim()함수를 사용하여 사용자 입력 데이터에서 불필요한 문자(여분의 공백, 탭, 줄 바꿈)를 제거합니다.

2. 사용자 입력 데이터에서 백 슬러시(\)를 제거합니다. (PHP stripslashes()함수 사용)


다음 단계는 우리에게 모든 검사를 수행하는 함수를 만드는 것입니다. (동일한 코드를 반복 작성하는 것보다 훨씬 편리합니다.)


test_input()함수를 소개합니다.


이제 $_POST변수를 test_input()함수로 검사하는 스크립트는 다음과 같이 보입니다.


<?php

// define variables and set to empty values

$mb_id = $mb_password = $mb_name = $mb_nicname = $mb_email = "";


if ($_SERVER["REQUEST_METHOD"] == "POST") {

  $mb_id = test_input($_POST["mb_id"]);

  $mb_password = test_input($_POST["mb_password"]);

  $mb_name = test_input($_POST["mb_name"]);

  $mb_nicname = test_input($_POST["mb_nicname"]);

  $mb_email = test_input($_POST["mb_email"]);

}


function test_input($data) {

  $data = trim($data);

  $data = stripslashes($data);

  $data = htmlspecialchars($data);

  return $data;

}

?>


스크립트의 시작 부분에서 $_SERVER['REQUEST_METHOD"]를 사용하여 양식이 제출되었는지 확인합니다.

REQUEST_METHOD가 POST이면 양식이 제출되어 유효성을 검사해야 합니다. 만약 제출되지 않은 경우, 유효성 검사를 생략하고 양식을 표시하십시오.


그러나 위의 예에서 모든 입력 필드는 선택사항입니다. 사용자가 데이터를 입력하지 않아도 스크립트는 정상적으로 작동합니다.


그누보드/영카트


-, XSS


/adm/admin.lib.php

/adm/faqlist.php


/bbs/alert.php

/bbs/confirm.php

/bbs/download.php

/bbs/member_confirm.php

/bbs/memo.php

/bbs/move.php

/bbs/profile.php

/bbs/register_email_update.php

/bbs/register_email.php

/bbs/register_form_update.php

/bbs/scrap_popin_update.php

/bbs/visit_insert.inc.php

/bbs/write_comment_update.php

/bbs/write_update.php


/lib/common.lib.php


/common.php

/head.sub.php




댓글목록 0

등록된 댓글이 없습니다.