차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
guide:android_개발_보안_가이드 [2013/11/22 05:55] – 121.140.124.172 | guide:android_개발_보안_가이드 [2024/04/04 05:12] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ===== Android 보안 개발 가이드 ===== | ||
+ | |||
===== 1절. 입력 데이터 검증 및 표현 ===== | ===== 1절. 입력 데이터 검증 및 표현 ===== | ||
사용자의 입력을 검증없이 그대로 받아들여 사용하면 많은 보안위협에 노출되게 된다. 해당 보안취약점을 예방하기 위해서는 유효한 입력데이터만 허용할 수 있도록 코딩하는 것이 좋으며, 부득이한 경우 입력값을 검증하여 검증된 데이터만 허용하도록 코딩하여 취약점을 제거해야 한다 | 사용자의 입력을 검증없이 그대로 받아들여 사용하면 많은 보안위협에 노출되게 된다. 해당 보안취약점을 예방하기 위해서는 유효한 입력데이터만 허용할 수 있도록 코딩하는 것이 좋으며, 부득이한 경우 입력값을 검증하여 검증된 데이터만 허용하도록 코딩하여 취약점을 제거해야 한다 | ||
줄 210: | 줄 212: | ||
6: InputStream in = socket.getInputStream(); | 6: InputStream in = socket.getInputStream(); | ||
7: OutputStream out = socket.getOutputStream(); | 7: OutputStream out = socket.getOutputStream(); | ||
- | 8: 주석문구 : Read from in and write to out... | + | 8: // Read from in and write to out... |
9: in.close(); | 9: in.close(); | ||
10: out.close(); | 10: out.close(); | ||
줄 226: | 줄 228: | ||
7: InputStream in = socket.getInputStream(); | 7: InputStream in = socket.getInputStream(); | ||
8: OutputStream out = socket.getOutputStream(); | 8: OutputStream out = socket.getOutputStream(); | ||
- | 9: 주석문구 : Read from in and write to out... | + | 9: // Read from in and write to out... |
10: in.close(); | 10: in.close(); | ||
11: out.close(); | 11: out.close(); | ||
줄 545: | 줄 547: | ||
1: …… | 1: …… | ||
2: public int factorial(int n) { | 2: public int factorial(int n) { | ||
- | 3: 주석문구 | + | 3: // 재귀 호출이 조건문/ |
4: return n * factorial(n - 1); | 4: return n * factorial(n - 1); | ||
5: } | 5: } | ||
줄 618: | 줄 620: | ||
9: conn = datasource.getConnection(); | 9: conn = datasource.getConnection(); | ||
10: } catch (SQLException e) { | 10: } catch (SQLException e) { | ||
- | 11: 주석문구 : catch 블록이 비어있음 | + | 11: // catch 블록이 비어있음 |
12: } catch (NamingException e) { | 12: } catch (NamingException e) { | ||
- | 13: 주석문구 : catch 블록이 비어있음 | + | 13: // catch 블록이 비어있음 |
14: } | 14: } | ||
15: return conn; | 15: return conn; | ||
줄 638: | 줄 640: | ||
9: conn = datasource.getConnection(); | 9: conn = datasource.getConnection(); | ||
10: } catch (SQLException e) { | 10: } catch (SQLException e) { | ||
- | 11: 주석문구 : Exception catch이후 Exception에 대한 적절한 처리를 해야 한다. | + | 11: // Exception catch이후 Exception에 대한 적절한 처리를 해야 한다. |
12: if ( conn != null ) { | 12: if ( conn != null ) { | ||
13: try { | 13: try { | ||
줄 647: | 줄 649: | ||
18: } | 18: } | ||
19: } catch (NamingException e) { | 19: } catch (NamingException e) { | ||
- | 20: 주석문구 : Exception catch이후 Exception에 대한 적절한 처리를 해야 한다. | + | 20: // Exception catch이후 Exception에 대한 적절한 처리를 해야 한다. |
21: if ( conn != null ) { | 21: if ( conn != null ) { | ||
22: try { | 22: try { | ||
줄 677: | 줄 679: | ||
2: public void f(boolean b) { | 2: public void f(boolean b) { | ||
3: String cmd = System.getProperty(" | 3: String cmd = System.getProperty(" | ||
- | 4: 주석문구 : | + | 4: // |
5: cmd = cmd.trim(); | 5: cmd = cmd.trim(); | ||
6: System.out.println(cmd); | 6: System.out.println(cmd); | ||
줄 688: | 줄 690: | ||
2: public void f(boolean b) { | 2: public void f(boolean b) { | ||
3: String cmd = System.getProperty(" | 3: String cmd = System.getProperty(" | ||
- | 4: 주석문구 : cmd가 null인지 체크하여야 한다. | + | 4: // cmd가 null인지 체크하여야 한다. |
5: if (cmd != null) { md = cmd.trim(); | 5: if (cmd != null) { md = cmd.trim(); | ||
6: System.out.println(cmd); | 6: System.out.println(cmd); | ||
줄 708: | 줄 710: | ||
=== 다. 예제 === | === 다. 예제 === | ||
<code Java |안전하지 않은 코드 예제 - Java> | <code Java |안전하지 않은 코드 예제 - Java> | ||
- | 1: 주석문구 : private 인 배열을 public인 메소드가 return한다 | + | 1: // private 인 배열을 public인 메소드가 return한다 |
2: private String[] colors; | 2: private String[] colors; | ||
3: public String[] getColors() { return colors; } | 3: public String[] getColors() { return colors; } | ||
줄 716: | 줄 718: | ||
<code Java|안전한 코드 예제 - Java> | <code Java|안전한 코드 예제 - Java> | ||
1: private String[] colors; | 1: private String[] colors; | ||
- | 2: 주석문구 : 메소드를 private으로 하거나, 복제본 반환, 수정하는 public 메소드를 별도로 만든다. | + | 2: // 메소드를 private으로 하거나, 복제본 반환, 수정하는 public 메소드를 별도로 만든다. |
3: public void onCreate(Bundle savedInstanceState) { | 3: public void onCreate(Bundle savedInstanceState) { | ||
4: super.onCreate(savedInstanceState); | 4: super.onCreate(savedInstanceState); | ||
줄 744: | 줄 746: | ||
<code Java |안전하지 않은 코드 예제 - Java> | <code Java |안전하지 않은 코드 예제 - Java> | ||
1: …… | 1: …… | ||
- | 2: 주석문구 : userRoles 필드는 private이지만, | + | 2: // userRoles 필드는 private이지만, |
3: private String[] userRoles; | 3: private String[] userRoles; | ||
4: | 4: | ||
줄 756: | 줄 758: | ||
<code Java|안전한 코드 예제 - Java> | <code Java|안전한 코드 예제 - Java> | ||
1: …… | 1: …… | ||
- | 2: 주석문구 : 객체가 클래스의 private member를 수정하지 않도록 한다. | + | 2: // 객체가 클래스의 private member를 수정하지 않도록 한다. |
3: private String[] userRoles; | 3: private String[] userRoles; | ||
4: | 4: | ||
줄 782: | 줄 784: | ||
3: try { g(); } | 3: try { g(); } | ||
4: catch (IOException e) { | 4: catch (IOException e) { | ||
- | 5: 주석문구 : 예외 발생시 printf(e.getMessage())를 통해 오류 메시지 정보가 유출된다. | + | 5: // 예외 발생시 printf(e.getMessage())를 통해 오류 메시지 정보가 유출된다. |
6: System.err.printf(e.getMessage()); | 6: System.err.printf(e.getMessage()); | ||
7: } | 7: } | ||
줄 796: | 줄 798: | ||
3: try { g(); } | 3: try { g(); } | ||
4: catch (IOException e) { | 4: catch (IOException e) { | ||
- | 5: 주석문구 : end user가 볼 수 있는 오류 메시지 정보를 생성하지 않아야 한다. | + | 5: // end user가 볼 수 있는 오류 메시지 정보를 생성하지 않아야 한다. |
6: System.err.println(" | 6: System.err.println(" | ||
7: } | 7: } | ||
줄 806: | 줄 808: | ||
=== 라. 참고 문헌 === | === 라. 참고 문헌 === | ||
가급적이면 공격의 빌미가 될 수 있는 오류와 관련된 상세한 정보는 최종 사용자에게 노출하지 않는다. | 가급적이면 공격의 빌미가 될 수 있는 오류와 관련된 상세한 정보는 최종 사용자에게 노출하지 않는다. | ||
- |