ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PHP] 18. Form Validation - PHP 강좌, PHP5
    Web/PHP 2015. 6. 13. 13:49


    PHP 5 Form Validation

     이번 장과 다음 장은 PHP에서 서식 유효성 검사를 어떻게 하는지 보도록 하겠습니다.






    1. PHP Form Validation

     이번 장에서 작업하게될 HTML 서식은 여러가지 입력 필드를 포함하고 있습니다: 필수적인 문자 필드나 선택적인 문자필드, 라디오 버튼, 전송버튼 

     



     서식에 대한 유효성 규칙은 아래와 같습니다:


    FieldValidation Rules
    NameRequired. + Must only contain letters and whitespace
    E-mailRequired. + Must contain a valid email address (with @ and .)
    WebsiteOptional. If present, it must contain a valid URL
    CommentOptional. Multi-line input field (textarea)
    GenderRequired. Must select one
     





    2. Text Fields

     name, email, website 필드는 텍스트 입력 요소입니다. 그리고 comment 필드는 텍스트 영역입니다. HTML 코드는 아래와 같습니다:


    1
    2
    3
    4
    Name: <input type="text" name="name">
    E-mail: <input type="text" name="email">
    Website: <input type="text" name="website">
    Comment: <textarea name="comment" rows="5" cols="40"></textarea>
    cs
     
     




    3. Radio Buttons

     성별 필드는 라디오 버튼이고 HTML 코드는 아래와 같습니다:


     

    1
    2
    3
    4
    Gender:
    <input type="radio" name="gender" value="female">Female
    <input type="radio" name="gender" value="male">Male
     
    cs







    4. The Form Element

     서식에 대한 HTML 코드는 아래와 같습니다:


     

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







     서식이 전송되어질 때, 서식 데이터는 메소드 "post" 방식으로 전송됩니다.



     * $_SERVER["PHP_SELF"] 변수가 무엇인가요?

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

     

     그러므로, $_SERVER["PHP_SELF"]는 페이지 자신에게 제출된 서식 데이터를 전송합니다. 


     * 이 방법은 사용자가 서식의 같은 페이지에 에러 메세지를 보이게 하기 위함입니다.








    5. Big Note on PHP Form Security

     $_SERVER["PHP_SELF"] 변수는 해커에 의해 사용될 수도 있습니다.


     PHP_SELF가 페이지에서 사용되고 있다면, 사용자가 슬래시(/)를 입력하면, 어떤 Cross Site Scripting(XSS) 명령어가 실행됩니다.


     * Cross-Site Scripting은 웹 어플리케이션에서 일반적으로 발견되는 컴퓨터 보안 취약성의 타입입니다. XSS는 다른 사용자들에게 보여지는 공격자(attacker)에게 웹 페이지에 클라이언트 측 스크립트를 주입할 수 있게 해줍니다.


     

     test_form.php라는 이름의 페이지에 아래 서식이 있다고 가정합시다:




     

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






     사용자가 "http://www.example.com/test_form.php"와 같은 일반적인 URL을 입력했다면, 위 코드는 아래와 같이 번역될 것입니다:



     

    1
    2
     
    <form method="post" action="test_form.php">
    cs






     지금까지는 아주 괜찮습니다.


     그러나, 아래 URL을 입력한다고 고려해 봅시다:



       



     이때는, 아래처럼 번역이 될 것 입니다:


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





     

     이 코드는 스크립트 태그와 알림 창 명령을 추가합니다. 그리고 페이지가 로드 될 때, 자바스크립트 코드는 실행되어 질 것 입니다(사용자는 알림 창을 보게될 것 입니다). 이 단지 예제는 간단하고 해가 없는 어떻게 PHP_SELF 변수가 부당하게 이용되는지를 보여주는 예제입니다.


     어느 자바스크립트 코드든 <script> 태그 안에 추가될 수 있다는 것을 명심하십시오! 

     해커는 다른 서버로 파일을 다시보낼 수 있고, 예를 들어 전역변수를 바꾼 악성 코드를 지닌 파일을 다시 보내거나 사용자 데이터를 저장한 서식을 다른 주소로 보낼 수 있습니다.





    6. How To Avoid $_SERVER["PHP_SELF"] Exploits?

     $_SERVER["PHP_SELF"]는 htmlspecialchars() 함수를 사용함으로써 악용되는 것을 피할 수 있습니다.


     서식 코드는 아래와 같습니다:


     

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





     htmlspecialchars() 함수는 특수 문자를 HTML 앤티티로 변환시킵니다. 이제 사용자가 PHP_SELF 변수를 통하여 악용을 하려한다면, 결과는 아래와 같아질 것 입니다.




     

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

     



     악용하기는 실패할 것이고, 피해는 없을 것 입니다!







    7. Validate Form Data With PHP

     처음으로 우리가 해야할 것은 PHP의 htmlspecialchars() 함수를 통하여 모든 변수를 보내야 하는 것 입니다.


     htmlspecialchars() 함수를 사용할 때, 아래 텍스트 필드를 제출하려 할 때,



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



     - 실행되지 않을 것 입니다, HTML 이스케이프 코드로 저장되기 때문입니다:



     

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

     



     코드는 이제 페이지 내에 안전하게 출력되거나 이메일 안에 있을 것 입니다. 


     사용자가 서식을 제출할 때 중요한 두 가지 이상의 일이 있습니다:

      1. 사용자의 입력 데이터에서 불필요한 문자(공백, 탭, 개행)을 없애십시오(PHP trim() 함수).

      2. 사용자 입력 데이터에서 백슬래쉬(\)를 제거하십시오(PHP stripslashes() 함수).


     

     다음 단계는 모든 것을 체크하기 위한 함수를 생성하세요 (매번 다시 같은 코드를 작성하는 것 보다 훨씬 편리합니다).



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <!DOCTYPE HTML
    <html>
    <head>
    </head>
    <body
     
    <?php
    // define variables and set to empty values
    $name = $email = $gender = $comment = $website = "";
     
    if ($_SERVER["REQUEST_METHOD"== "POST") {
       $name = test_input($_POST["name"]);
       $email = test_input($_POST["email"]);
       $website = test_input($_POST["website"]);
       $comment = test_input($_POST["comment"]);
       $gender = test_input($_POST["gender"]);
    }
     
    function test_input($data) {
       $data = trim($data);
       $data = stripslashes($data);
       $data = htmlspecialchars($data);
       return $data;
    }
    ?>
     
    <h2>PHP Form Validation Example</h2>
    <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"
       Name: <input type="text" name="name">
       <br><br>
       E-mail: <input type="text" name="email">
       <br><br>
       Website: <input type="text" name="website">
       <br><br>
       Comment: <textarea name="comment" rows="5" cols="40"></textarea>
       <br><br>
       Gender:
       <input type="radio" name="gender" value="female">Female
       <input type="radio" name="gender" value="male">Male
       <br><br>
       <input type="submit" name="submit" value="Submit"
    </form>
     
    <?php
    echo "<h2>Your Input:</h2>";
    echo $name;
    echo "<br>";
    echo $email;
    echo "<br>";
    echo $website;
    echo "<br>";
    echo $comment;
    echo "<br>";
    echo $gender;
    ?>
     
    </body>
    </html>
    cs

     

     







     스크립트의 초반에 보면, $_SERVER["REQUEST_METHOD"]를 사용하여 서식이 제출되었는지 체크합니다.


     REQUEST_METHOD가 POST인 경우, 서식은 제출되어 진 것 입니다 - 그리고 유효하다는 거죠. 


     그러나, 위 예제에서 모든 입력 필드는 선택적 입니다. 스크립트는 사용자가 어느 데이터든 입력하지 않아도 잘 돌아갑니다.


     다음 장에서는 필수적인 입력필드 만들기와 필요로 하는 경우 에러 메세지를 만드는 작업을 하겠습니다.










    * 이 강좌는 'w3schools'를 참조하여 작성하였습니다.

    댓글

Designed by Tistory.