본문 바로가기

보안/시큐어코딩

[시큐어코딩-2] 입력데이터 검증및 표현(2) 자원삽입


발생원인


외부 입력값이 내부 자원에 대한 식별자가 되는 환경에서 입력값을 검증하지 않을 경우 발생한다.



영향


시스템 내부 자원 접근, 수정, 자원간의 충돌 발생



코드예



 

 안전하기 않은 코드의 예 - JAVA

……

public void f() throws IOException {

  int def = 1000;

  ServerSocket serverSocket;

  Properties props = new Properties();

  String fileName = "file_list";

  FileInputStream in = new FileInputStream(fileName);

  props.load(in);

 

  // 외부에서 입력한 데이터를 받는다.

 

  String service = props.getProperty("Service No");

  int port = Integer.parseInt(service);

 

  // 외부에서 입력받은 값으로 소켓을 생성한다.

 

  if (port != 0)

    serverSocket = new ServerSocket(port + 3000);

  else

    serverSocket = new ServerSocket(def + 3000);

   ……

}

……

 

Service No에 대한 입력값의 검증이 없다. 

 

 

 

 안전한 코드의 예 - JAVA

 ……

public void f() throws IOException

{

   ServerSocket serverSocket;

   Properties props = new Properties();

   String fileName = "file_list";

   FileInputStream in =  new leInputStream(fileName);

   FileInputStream in=new FileInputStream(fileName)

  String service = "";

 

  if (in != null && in.available() > 0) {

     props.load(in);

     // 외부로부터 데이터를 입력받는다.

     service = props.getProperty("Service No");

  }

 

  // 외부의 입력을 기본적인 내용 검사를 한다.

  if ("".equals(service)) service = "8080";

  int port = Integer.parseInt(service);

 

 // 외부 입력에서 포트번호를 검사한 후 리스트에서 적합한 값을 할당한다.


 switch (port) {

 case 1:

     port = 3001; break;

 case 2:

     port = 3002; break;

 case 3:

     port = 3003; break;

 default:

     port = 3000;

 } 

 

  // 서버소켓에 검사완료된 포트를 할당한다.

  serverSocket = new ServerSocket(port);

  ……

 }

  ……

 입력값 검사후 적절한 값을 할당함