Sep 30, 2009 - Web 화면에서 특수한 기호(이하 특수문자) 인식

특수문자를 HTML TAG로 변환하는 방법

1. " : "
2. & :  &
3. < : &lt;
4. > : &gt;
5. non-breaking space : &nbsp;

문제

ㄱ. <input type=text name=n value="">">
ㄴ. alert("">");

ㄱ, ㄴ 의 예제와 같이 특정 html 출력시에 DB의 데이터를 그대로 사용할 경우 HTML 문서 오류가 발생할 가능성이 있습니다.

이러한 경우 4번과 5번은 HTML 태그를 손상시키지 않으므로 무시해도 됩니다.

그렇다면 문제가 발생하지 않기 위해선

  1. DB에 넣기 전에 1,2,3 의 경우 변환한 후 데이터 입력
  2. HTML에 그대로 적용

(만약 HTML 에 적용하기 전에 수정하거나 사용되어진다면, DB에는 그대로 넣고 HTML 출력 바로 직전에 변환하는 과정 필요)

결론 :

DB에 넣을 때는 신경쓰지 않아도 되지만, 빼올 때 어떻게 처리하는 지에 따라서 고민해보아야 합니다.

HTML 출력시 혹은 디바이스에서 처리할 때 문제가 발생하면,

( “, &, <) 와 같은 문자열을 (", &, <)로 변환시켜주면 됩니다.

ㄷ. <input type=text name=n value="&quot;&lt;">
ㄹ. alert("&quot;&lt;");

위와 같은 경우에도 실제로는 메시지 창에서 “> 란 값이 출력될 수도 있으므로 고민을 해봐야합니다. 아무때나 변경시키면 곤란하다는 의미입니다.

<!-- 상세 소스-->
 public static String escapeHtmlString(String s)
 {
  String s1 = s;
  if (s1 == null)
   return null;
  if (s1.indexOf(38, 0) != -1)
   s1 = replace(s1, "&", "&amp;");
  if (s1.indexOf(60, 0) != -1)
   s1 = replace(s1, "<", "&lt;");
  if (s1.indexOf(62, 0) != -1)
   s1 = replace(s1, ">", "&gt;");
  if (s1.indexOf(34, 0) != -1)
   s1 = replace(s1, "\"", "&quot;");
  return s1;
 }

로 강제로 변환하는 로직을 구현합니다.

Apr 9, 2009 - POPUP_OPNER

자식창에서 부모창의 파일업로드 기능

클라이언트의 승낙 없이는 클라이언트의 자원을 함부로 사용할 수 없습니다.

파일업로드의 경우 클라이언트의 사용자가 직접 입력하지 않고
스크립트를 사용한다던지 하는 것은 보안차단되어 있습니다.

현재 팝업창에서 파일업로드가 되면서 DB에 저장되는 형식을 가지고 있는데
다른 부분은 OPNER 로 빼서 팝업에 넘겨주는 것이 가능하나, 파일업로드의 경우 OPNER 에서 처리하지 않고
POPUP 창까지 클라이언트가 올리려던 경로를 기억해 둔 다음,
POPUP 창에서 처리하려고 할 경우 지금 기억하고 있는 것이 클라이언트가 집적 마우스로 선택해서 올리기 위한 자의적인 파일인지,
코더가 악의적으로 하드내의 특정 파일을 빼내려고 경로를 잡은 건지 알 방법이 없기에,
원칙적으로 이러한 코딩이 보안 설정되어있는 것으로 압니다.

이를 해결하기 위해선, 클라이언트의 사용자 승낙(예를 들어, ActiveX의 설치 과정)을 받아 클라이언트에 해당 파일을 업로드하도록 만들어진 프로그램을 설치해야만 그런 기능이 가능할 것입니다.

혹은 우선 OPNER 에서 실지로 파일을 임시 폴더로 업로드 한 뒤에,
메일 발송을 할 경우에 경로에 있는 임시 파일을 실제 파일 경로로 옮기는 것도 가능은 할 거 같습니다.

Feb 26, 2009 - sqlMapConfig

sqlMapConfig

properties resource=”데이타베이스 설정한 곳 주소”
알바티스를 위한 셋팅, 정의는 되어있으나 특별하게 셋팅할 필요는 없습니다.

<settings
cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="false"
/>

cacheModelsEnabled : 한번 사용했던 데이타는 나중에 또 언젠가는 쓸지 모르니 caching 하여 사용할 것인지 확인 useStatementNamespaces : 여러개의 sqlMap의 namespace 가 BlogUser 라 할때, resource 가 존재했을때 유용함, id로만 접근할 것인가, 아미녀 sqlmap.statement이름으로 구성할 것인지를 확인

<typeAlias alias="full pacage 에 대한 별칭을 알려줌">

JDBC, SIMPLE 같은 경우에는 iBATIS가 별칭으로 해당 명칭을 매칭시켜줍니다.

<transactionManager type="JDBC" >
<dataSource type="SIMPLE">
<property name="url을 읽어옴.">
JDBC : 트랙젝션을 그대로 사용
EXTERNAL : 사용자가 직접
JTA :  2기종간의 데이터베이스 여러가지의 DB를 하나로 관리가능
SIMPLE : (내가 집적) 알바티스 설정 문서 안에서 DB 커넥션을 얻거나, 데이터 소스 설정을 얻을 수 있습니다.
JNDI : 컨테이너가 제공하는 WAS가 제공해주는 DB 소스를 사용
DBCP : 자카르타의 DBCP

최종적으로 소스에 가장 상위에는

SqlMapConfig.xml
SqlMap.xml .. . .. . . . ...

가 하나가 되서 iBATIS 로 이루어져있습니다.
파라미터를 넘기고 결과를 객체로 받거나 XML로 받거나 하는 형태가 iBATIS 를 의미합니다.
settings 요소를 건드릴 필요는 없습니다.