bool ctype_alnum ( string $text )
(PHP 4 >= 4.0.4, PHP 5)

이 함수는 [a-zA-Z0-9] 로 숫자, 영문 대소문자에 해당되면 true를, 실패하면 false를 반환합니다.

<?php
 $strings = array('AbCd501zyZ9', 'foo!#$bar', '', ' ', 'asdc xc'); 
 $i = 1;
 foreach ($strings as $testcase) {
    if (ctype_alnum($testcase)) {
        echo "$i $testcase 에는 문제되는 문자가 없습니다.\n";
    } else {
        echo "$i $testcase 에는 문제되는 다른 문자가 포함되어 있습니다.\n";
    } 
    $i++;
 }
 /*
 결과:
 1 AbCd501zyZ9 에는 문제되는 문자가 없습니다.
 2 foo!#$bar 에는 문제되는 다른 문자가 포함되어 있습니다.
 3 에는 문제되는 다른 문자가 포함되어 있습니다.
 4  에는 문제되는 다른 문자가 포함되어 있습니다.
 5 asdc xc 에는 문제되는 다른 문자가 포함되어 있습니다.
 */
 ?>

다음의 id체크 표현은 정규표현식으로 하는게 더 정확하고, 불필요한 오류를 줄일 수 있는 장점이 있지만, 느리다는 단점이 있으니 적절한 방법으로 코딩하면 될 것 같습니다.

<?php
 $userid = $_POST['user_id'];

 if (ctype_alnum($userid)) {
    if((strlen($userid) < 5) || (strlen($userid) > 12)){
        echo "id 는 5자이상 12자 이하로 작성해 주십시요.";
    } else { 
        echo "id 는 정상적으로 작성하셨습니다."; 
    }
 } else {
    echo "id로 허용할 수 없는 문자가 포함되어 있습니다. id는 영문 대소문자, 숫자만 허용합니다.\n";
 } 
 ?>

다음은 파일시스템 보안에 대한 설명입니다. 한눈에 보아도 문제가 보이죠?

<?php
 $username = $_POST['user_submitted_name']; // "../etc"
 $userfile = $_POST['user_submitted_filename']; // "passwd"
 $homedir  = "/home/$username"; // "/home/../etc"

 unlink("$homedir/$userfile"); // "/home/../etc/passwd"

 echo "The file has been deleted!";
 ?>

이 문제를 적절히 수정해 주면, 다음과 같이 유용하게 대처할 수 있습니다.

<?php
 $username = $_POST['user_submitted_name']; // "../etc"
 $userfile = $_POST['user_submitted_filename'];
 $homedir  = "/home/$username";

 $filepath     = "$homedir/$userfile";

 if (!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD', $userfile)) {
    die("Bad username/filename");
 }
 //etc...
 ?>

<?php
 $file = $_GET['file']; 

 switch ($file) {
    case 'main':
    case 'foo':
    case 'bar':
        include '/home/wwwrun/include/'.$file.'.php';
        break;
    default:
        include '/home/wwwrun/include/main.php';
 }
 ?>

0 댓글