KSH
조회 수 53 댓글 4

GET 타입으로 변수를 받아 데이터를 처리하려고 합니다.

총 8자의 GET 타입 변수이며 앞 3자는 소문자 영문, 뒤의 5자리는 소문자 영문 혹은 숫자로 데이터를 받고자 합니다.

그냥 받아다 써도 되긴 하는데, SQL Injection 이라는 공격에 노출될수도 있다고 하네요.

정규식이란걸 써야 안전하게 처리를 할수 있다고 합니다.

 

abc.com/index.php?id=abc12345

abc.com/index.php?id=cba12ab1

이러한 형태로 값을 받고, preg_match 라는 함수로 패턴찾기를 수행할까 합니다.

이 패턴을 벗어나면 다음코드가 실행이 안되고, 이러한 패턴을 만족시켜야만 다음 코드를 실행해야 합니다.

정규식이란걸 보니 눈이 뱅뱅 돌아갑니다.

특수문자랑 a-z 라는 문자열도 들어가니 이해하기가 어렵네요.

위 패턴이 맞는지를 확인하려면 정규식을 어떻게 짜야할까요?

  • profile
    기진곰 2016.06.16 21:18:36

    어떤 패턴인가요?

     

    숫자와 영문만 들어가면 되는 거라면 정규식을 꺼낼 필요도 없이 if (ctype_alnum($id)) 이런 식으로 체크해도 됩니다. ctype_alnum은 주어진 문자열이 영문 알파벳(alphabet)과 숫자(number)만으로 이루어져 있는지 체크하는 함수입니다. 정규식을 쓰는 것보다 성능도 좋고요.

     

    예를 드신 것을 보면 알파벳도 다 들어가는 게 아니라 0-9, A-F까지만 들어가는지도 모르겠습니다. 만약 이렇게 16진수로 이루어진 문자열이라면 ctype_xdigit 함수로 체크하면 됩니다. 여기에도 정규식은 필요하지 않습니다.

  • ?
    KSH 2016.06.16 21:23:49
    답변 감사합니다.
    GET으로 입력받는 데이터는 총 길이가 8이고
    1번째부터 3번째는 알파벳 소문자만 들어갑니다. (a부터z)
    4번째부터 8번째는 알파벳 소문자 혹은 숫자가 들어갑니다 (a부터z , 숫자)
    알파벳 f 이후의 문자도 들어가므로 16진수 형태는 아닙니다.
  • profile
    기진곰 2016.06.16 21:35:50

    아, 그런 형식이면 정규식을 써야겠네요. ctype 함수로 뜯어보는 게 오히려 더 복잡할 테니...

    preg_match('/^[a-z]{3}[0-9a-z]{5}$/', $id)

     

    / = 정규식 시작

    ^ = 문자열 시작

    [a-z] = a부터 z까지의 문자

    {3} = 3개

    [0-9a-z] = 0부터 9까지 또는 a부터 z까지의 문자

    {5} = 5개

    $ = 문자열 끝

    / = 정규식 끝

  • ?
    KSH 2016.06.16 21:38:02
    세세한 답변 정말 감사합니다.

서버에 요청 중입니다. 잠시만 기다려 주십시오...