본문 바로가기

보안/시큐어코딩

[시큐어코딩실습] 정규식 테스트

자바 SE 정규식 리퍼런스: 

http://docs.oracle.com/javase/tutorial/essential/regex/


예제소스 파일: 

reg.txt



정규식테스트



정규식(regular Expression)은 사전적인 의미로는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식이다.


프로그래밍 언어나  명령어 쉘에서 특정 문자열을 검색하거나 취환하는 용도로 많이 사용된다. 



[예제1] 자바프로그램에서 정규식은 Pattern과 Matcher 클래스를 사용하여 활용할 수 있다.

public String regTest(String data) {

StringBuffer buffer=new StringBuffer();

String regEx ="^(\\d{1,}):\\D{1,}:(\\1)$";

System.out.println("**receive request: "+ data);

if ( data != null ) {

       Pattern p=Pattern.compile(regEx);

       Matcher m= p.matcher(data);

       if ( m.find() ) {

       buffer.append(" Valid Input: "+data);  

         }else {

       buffer.append("Invalid Input: "+data);

       }

 } else {

     buffer.append("Input data is null !! ");

 }

    return buffer.toString();

}



[예제2]  전화번호 입력란에 입력되는 값이 전화번호 형식의 패턴을 이용하여 입력값의 유효성을 점검한다.

public String testRegEx(HttpServletRequest request) {

StringBuffer buffer=new StringBuffer();

String data=request.getParameter("data");


// 입력값이 전화번호 규격에 맞으면 유효한 입력값, 

                // 맞지 않으면 유효하지 않은 입력값을 응답한다.


String regex="^\\d{2,3}-\\d{3,4}-\\d{4}$";

Pattern p=Pattern.compile(regex);

Matcher m=p.matcher(data);


if ( m.matches() ) {

buffer.append("유효한 입력값: "data);

} else{

buffer.append("유효하지 않은 입력값: "+data);

}

                return buffer.toString();

}


[예제3] 그루핑 ()을 이용하여 입력값의 패턴을 체크할 수 있다. (처음 나온 값이 세번째 컬럼에 포함되어 있는 경우 유효한 값으로 판단, 두번째 컬럼은 반드시 숫자여야 함)

public String testRegEx(HttpServletRequest request) {

StringBuffer buffer=new StringBuffer();

String data=request.getParameter("data");


// kim:1234:/home/kim:                <--  유효한 입력

// lee:11:/home/guest:                  <--  유효하지 않은 입력          

// park:A90:/home/park:test          <--  유효하지 않은 입력   

// choi:3:/home/guest:choi            <--  유효하지 않은 입력   


String regex="^([a-zA-Z0-9]+):[0-9]+:/home/(\\1):.*";

Pattern p=Pattern.compile(regex);

Matcher m=p.matcher(data);

if ( m.matches() ) {

buffer.append("유효한 입력값: "+data);

} else{

buffer.append("유효하지 않은 입력값: "+data);

}

        return buffer.toString();


}


[예제4] 입력값이 <script>......</script> 패턴의 값을 포함하고 있으면 입력값을 HTML 인코딩 하여  출력한다.

public String testRegEx(HttpServletRequest request) {

StringBuffer buffer=new StringBuffer();

String data=request.getParameter("data");


// <script>alert("xss");</script> 패턴에 일치하면

// 입력값을 html 인코딩 하여 출력한다. 

// <script>alert("xss");</script>

// <SCRIPT>alert("xss");</SCRIPT>

// <ScRiPt>alert("xss");</ScRiPt>

                //  <script   >alert("xss"); </   script>


String regex="<\\s*script\\s*>.*</\\s*script\\s*>";

Pattern p=Pattern.compile(regex,Pattern.CASE_INSENSITIVE);

Matcher m=p.matcher(data);


if ( m.find() ) {

buffer.append("입력값: "+htmlEncoding(data));

} else{

buffer.append("입력값: "+data);

}

        return buffer.toString();


}


public String htmlEncoding(String data){

return data.replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll("'", "&apos;")

        .replaceAll("\"", "&quot;").replaceAll(" ", "&nbsp;");

}



[예제5] 패스워드 정책이 적용되도록 입력값을 검증한다.

              알파벳,숫자,특수문자를 포함, 8글자 이상의 문자열인 경우 패스워드 설정 허용

String p="(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=])(?=\\S+$).{8,}";

Pattern pattern=Pattern.compile(p);

Matcher matcher = pattern.matcher(data);


if ( matcher.matches()) {

     buffer.append("유효한 패스워드: "+data);

} else {

      buffer.append("유효하지않은 패스워드: "+data);

}



정규표현식 – wiki백과 : http://ko.wikipedia.org/wiki/

정규표현식의 기본 문법 정리표 : http://blog.daum.net/creazier/15309380

정규표현식 사용하기 : http://icoon22.tistory.com/220

자바스크립트 정규 표현식 : http://yaku.tistory.com/75

Perl 정규표현식, 메타데이타 

http://blog.naver.com/PostView.nhnblogId=turtle1006&logNo=60107758671

정규표현식 학습 및 연습 -> http://gskinner.com/RegExr/

정규표현식을  도식화해서 보여주는 사이트:  http://www.regexper.com/