2013. 5. 11. 06:57

<script type="text/javascript" src="/js/jQuery/jquery.xml2json.js"></script>

var xml = '<xml><message>Hello world</message></xml>';

var json = $.xml2json(xml);

alert(json.message);

자세한 내용은

http://www.fyneworks.com/jquery/xml-to-json/

 

http://blog.naver.com/dlckdrl/50086286841

Posted by 물색없는세상
2013. 4. 15. 19:13

■ 실행 명령어 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


calc : 계산기
charmap : 문자표
cleanmgr : 디스크정리
clipbrd : 클립보드에 복사된 내용 표시
control : 제어판
dfrg.msc : 디스크 조각모음
dxdiag : 다이렉트X 진단도구 및 그래픽과 사운드의 세부정보를 보여줌
eudcedit : 사용자 정의 문자 편집기
explorer : 탐색기
magnify : 돋보기
mobsync : 동기화
msconfig : 시작프로그램 제어등 많은기능 제공
msinfo32 : 시스템정보
mstsc : 원격 데스크톱 연결
netstat -na : 현재 열린포트와 TCP/IP 프로토콜정보를 보여줌
: 열린포트로 트라이목마형 바이러스 침투 유무확인가능
notepad : 메모장
ntbackup : 백업 및 복원 마법사
osk : 화상키보드
pbrush 또는 mspaint : 그림판
ping 사이트주소 : 핑테스트 해당 사이트의 인터넷연결 유무 확인
regedit : 레지스트리 편집기
sfc : 시스템 파일 검사기
- 시스템 파일을 검사한후 깨지거난 손실된 파일을 원본 압축파일에서 찾아서 복원시켜줌
단, 윈2000에서는 cmd실행 후 sfc사용 - 마지막 설정된 값을 다음 윈도우부팅시 곧바로 실행됨
sndrec32 : 녹음기
sndvol32 : 시스템 사운드 등록정보,볼륨조절
sysedit : autoexec.bat, config.sys, win.ini, system.ini 시스템구성편집기
systray : 사운드 볼륨설정 노란색 스피커 아이콘을 트라이목록에 띄움
telnet open 사이트주소 : 텔넷접속명령어
tourstart : 윈도우 기능안내 html 문서표시
wab : 주소록
winipcfg : 인터넷에 접속된 자신의 아이피 주소를 보여줌 ( 단, 윈2000 이상은 ipconfig로 변경됨 )
winmine : 지뢰찾기;
winver : 윈도우 버전확인
wmplayer : 윈도우 미디어 플레이어
wordpad : 워드패드
wscui.cpl : 보안센터
wupdmgr : 윈도우업데이트

■ msc 명령어 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


certmgr.msc : 인증서 관리
ciadv.msc : 인덱싱 서비스
compmgmt.msc : 컴퓨터 관리
devmgmt.msc : 장치관리자
dfrg.msc : 디스크 조각 모음
diskmgmt.msc : 디스크 관리
eventvwr.msc : 이벤트 뷰어 (이벤트 로그)
fsmgmt.msc : 공유 폴더 (공유 폴더 관리)
gpedit.msc : 그룹 정책
lusrmgr.msc : 로컬 사용자 및 그룹
ntmsmgr.msc : Removable Storage
ntmsoprq.msc : 이동식 저장소 운영자 요청
perfmon.msc : 성능
rsop.msc : 정책의 결과 집합
secpol.msc : 로컬 보안 설정
services.msc : 서비스
wmimgmt.msc : WMI 서비스 구성
comexp.msc : comexp 구성 요소 서비스
control userpasswords2 : 사용자 계정

 

http://blog.naver.com/lunarhorizon/100036450897

 

Posted by 물색없는세상
2013. 4. 11. 15:07

1. USER_TABLES : 테이블정보

2. USER_TAB_COLUMNS : 컬럼정보

3. USER_OBJECTS : 모든 오브젝트의 정보를 알려줌

4. USER_VIEWS : 뷰에 대한 정보

5. USER_SYNONYMS : 동의의 정보

6. USER_SEQUENCES : 시퀀스 정보

7. USER_CONSTRAINTS : 제약조건에 대한 정보

8. USER_CONS_COLUMNS : 제약조건에 대한 컬럼정보

9. USER_TAB_COMMENTS : 테이블/뷰에 대한 주석

10. USER_COL_COMMENTS : 컬럼에 대한 주석

11. USER_INDEXES : 인덱스에 대한 정보

12. USER_IND_COLUMNS : 인덱스 컬럼에 대한 정보

13. USER_CLUSTERS : 클러스터에 대한 정보

14. USER_DB_LINKS : 데이터베이스 링크 정보

15. USER_TRIGGERS : 트리거 정보

16. USER_SOURCE : 프로시저, 함수, 패키지 정보

17. USER_ERRORS : 코드 에러에 대한 정보

18. USER_TABLESPACES : 테이블 스페이스 정보

19. USER_USERS : 사용자에 대한 정보

20. USER_TAB_PRIVS : 테이블 권한에 대한 정보

21. USER_COL_PRIVS : 테이블열 권한에 대한 정보

22. USER_SYS_PRIVS : 시스템 권한에 대한 정보


select * from USER_SOURCE where text=''

 

 

'Database > Oracle' 카테고리의 다른 글

[ORACLE] 패스워드 정책, ORA-28000 : the account is locked  (0) 2012.12.11
Posted by 물색없는세상
2013. 4. 4. 11:00

################################################

접근통제 취약점

################################################

□ 취약한 프로그래밍 예

<HTML>
<HEAD><TITLE> 관리자 페이지 </TITLE>
<SCRIPT language="JavaScript“>
function getCookie(name)
var cname = name +"=";
var dc = document.cookie;

if(dc.length > 0)
begin = dc.indexOf(cname);
if(begin != -1)
begin += cname.length;
end = dc.indexOf(";", begin);

if(end == -1) end = dc.length;
retrun unescape(dc.substring(begin, end));


return null;

function getValue(element)
var value = getCookie(element.name);
if(value != null) element.value = value;

</SCRIPT>
</HEAD>
<BODY>
<SCRIPT language="JavaScript“>
var auth;
auth = getCookie("logged_in");

if(auth != 1) // 인증 성공 쿠키가 없을경우 Main Page로 이동
window.location = "http://victim.com/login.html";

</SCRIPT>

관리자 페이지 내용

==========================================================

□ 안전한 프로그래밍 예

o ASP

<%
If myfunc_userauth(userid, userpw) <> 1 Then 'DB에서 사용자 인증을 처리
Response.write "인증 실패"
Else
If Request.ServerVariables("REMOTE_ADDR") <> "10.10.1.1" Then' 관리자 IP 확인
Response.write "관리자 IP가 아닙니다."
Response.write "인증실패“
LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
Else
Session("logged_in") = 1'인증에 성공했을경우 logged_in 에 1의 값을 셋팅
Session("userid") = userid
Session("user_ip") = Request.ServerVariables("REMOTE_ADDR")

LogSave($userid, $user_ip)'접속에 사용한 ID 및 IP 기록

... 중략 ...
End If
End If
%>


o PHP

<?PHP
@session_start(); //세션 데이터를 초기화
if(!myfunc_userauth($userid, $userpw) || $_SERVER["REMOTE_ADDR'] != "10.10.1.1")
//DB 에서 사용자 인증을 처리, 관리자 IP인지 확인
print "인증 실패";
LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
exit;//인증 실패시 종료


//인증에 성공한 경우 처리 해야 되는 부분
if (!session_is_registered("logged_in"))

$logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
$user_ip = $_SERVER["REMOTE_ADDR"];
session_register("logged_in");//인증 결과 저장
session_register("userid");//사용자 ID를 저장
session_register("user_ip");//사용자 IP를 저장

LogSave($userid, $user_ip);// 접속한 사용자 ID 및 IP 기록
... 중략 ...


o JSP

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.* " %>
<%@ page import="java.sql.* " %>
<%
//HttpSession session = request.getSession(true);
String user_ip = request.getRemoteAddr();

// form 에서 사용자 id와 사용자 password를 아래 변수로 전달
if(!myfunc_userauth(userid, userpw) || !user_ip.equals("10.10.1.1"))
//DB 에서 사용자 인증을 처리, 관리자 IP인지 확인
out.println "인증 실패";
LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
else
//인증에 성공한 경우 처리 해야 되는 부분
session.putValue("logged_in","logok");
session.putValue("userid",userid);
session.putValue("user_ip", user_ip);

LogSave(userid, user_ip);// 접속한 사용자 ID 및 IP기록
...

==========================================================

##################################################

부적절한 파라미터 - 소스

##################################################


□ ASP


o 취약한 프로그래밍 예

<%
strSize = Request.QueryString("font_size")'사용자로부터 폰트의 크기 입력

Response.Write "<HTML><TITLE>사용자 입력값 검증</TITLE></HEAD>"
Response.Write "<BODY>"
Response.Write "<FONT size=" & strSize & ">글자 크기 조절</FONT>"

' ... 중략 ...

===========================================================

o 안전한 프로그래밍 예

<%
Size = Request.QueryString("font_size")' 사용자로부터 폰트의 크기 입력

Size = CInt(Size)' 입력되는 값을 정수로 형 변환

Response.Write "<HTML><TITLE>사용자 입력값 검증</TITLE></HEAD>"
Response.Write "<BODY>"
Response.Write "<FONT size=" & Size ">글자 크기 조절</FONT>"

' ... 중략 ...

============================================================

□ PHP


o 취약한 프로그래밍 예


<?PHP
include "./inc/dbconn.inc";// DB 연결 헤더
include $language . "/head.html";// 각 국가 언어별 HTML 출력

$conn = mysql_connect($SERVER, $USER, $PASSWD);
$query = "select count(*) from main_tbl";

// ... 중략 ...

============================================================

o 안전한 프로그래밍 예

<?PHP
@require_once "./inc/dbconn.inc";// DB 연결 헤더
$default_lang = "korea";// 기본값 설정

if(!file_exists($language."/head.html")) // 파일이 존재하는지 체크
if(eregi(":\/\/", $language)) $language = $default_lang;// URL이 포함되는지 체크
else // 파일이 없는 경우 기본값 설정
$language = $default_lang;

@require_once $language . "/head.html";// 각 국가 언어별 HTML 출력

$conn = @mysql_connect($SERVER, $USER, $PASSWD);
$query = "select count(*) from main_tbl";

// ... 중략 ...

==============================================================

□ JSP

o 취약한 프로그래밍 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.* " %>

<HTML><HEAD><TITLE> 사이트 접속 불가 </TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="10;URL=http://victim.com/bye.html">
</HEAD>
<BODY>
<%
out.print("지금 사용하고 계신 ");
out.print(request.getHeader("USER-AGENT"));
out.print(" 브라우져로는 사이트 접속이 불가능 합니다.");
%>
</BODY>
</HTML>

=========================================================

o 안전한 프로그래밍 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.* " %>

<HTML><HEAD><TITLE> 사이트 접속 불가 </TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="10;URL=http://victim.com/bye.html">
</HEAD>
<BODY>
<%
String user_agent = request.getHeader("USER-AGENT");

// HTTP HEADER 중 USER_AGENT를 변경 하여 크로스사이트 스크립트 공격하는 것을 차단
user_agent = user_agent.replaceAll("<","&lt;");// HTML tag가 있을 경우 제거
user_agent = user_agent.replaceAll(">","&gt;");

out.print("지금 사용하고 계신 ");
out.print(user_agent);
out.print(" 브라우져로는 사이트 접속이 불가능 합니다.");

%>
</BODY>
</HTML>

==========================================================

##################################################

취약한 세션 관리 (Cookie Injection) - 소스

##################################################

□ ASP


o 취약한 프로그래밍 예

'login_ok.asp 사용자 인증 처리를 하는 스크립트
<%
' form 에서 사용자 id와 사용자 password를 아래 변수로 전달
If myfunc_userauth(userid, userpw) <> 1 Then ' DB 에서 사용자 인증을 처리하는 부분
Response.write "인증 실패"
Else
'인증에 성공한 경우 처리 해야 되는 부분
Response.Cookies("logged_in") = 1
' 인증에 성공했을경우 logged_in 에 1의 값을 셋팅
Response.Cookies("userid") = userid
End If
...
%>

user_menu.asp' 사용자 검증이 필요한 페이지
<%
IF Request.Cookies("logged_in") = 1 Then
Response.write "허가된 사용자 입니다."
Else
Response.write "허가되지 않은 사용자 입니다."
End If
%>

===========================================================

o 안전한 프로그래밍 예

‘login_ok.asp 사용자 인증 처리를 하는 스크립트
<%
' form 에서 사용자 id와 사용자 password를 아래 변수로 전달
If myfunc_userauth(userid, userpw) <> 1 Then ' DB 에서 사용자 인증을 처리하는 부분
Response.write "인증 실패"
Else
'인증에 성공한 경우 처리 해야 되는 부분

If Session("logged_in") <> 1 Then
Session("logged_in") = 1'인증에 성공했을경우 logged_in 에 1의 값을 셋팅
Session("userid") = userid
Session("user_ip") = Request.Servervariables("REMOTE_ADDR")
End If
End If
...
%>

‘user_menu.asp 사용자 검증이 필요한 페이지
<%
IF Session("user_ip) = Request.Servervariables("REMOTE_ADDR") AND Session("logged_in") = 1 Then
'인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
'...
Else
Response.write "허가되지 않은 사용자 입니다."
End If
%>

==========================================================

□ PHP

o 취약한 프로그래밍 예

//login_ok.php// 사용자 인증 처리를 하는 스크립트
<?PHP
// form 에서 사용자 id와 사용자 password를 아래 변수로 전달
if(!myfunc_userauth($userid,$userpw)) //DB 에서 사용자 인증을 처리하는 부분
print "인증 실패";
exit;//인증 실패시 종료


//인증에 성공한 경우 처리 해야 되는 부분
setcookie("logged_in", "1");//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
setcookie("userid", $userid);
...
?>

//user_menu.php// 사용자 검증이 필요한 페이지
<?PHP
if($_COOKIE["logged_in"] == 1)
echo "인증 성공: " . $_COOKIE["userid"];

?>

===========================================================

o 안전한 프로그래밍 예

//login_ok.php// 사용자 인증 처리를 하는 스크립트
<?PHP
@session_start(); //세션 데이터를 초기화
// form 에서 사용자 id와 사용자 password를 아래 변수로 전달
if(!myfunc_userauth($userid,$userpw)) //DB 에서 사용자 인증을 처리하는 부분
print "인증 실패";
exit;//인증 실패시 종료

//인증에 성공한 경우 처리 해야 되는 부분
if (!session_is_registered("logged_in"))

$logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
$user_ip = $_SERVER["REMOTE_ADDR"];
session_register("logged_in");//인증 결과 저장
session_register("userid");//사용자 ID를 저장
session_register("user_ip");//사용자 IP를 저장

...
?>

//user_menu.php// 사용자 검증이 필요한 페이지
<?PHP
session_start();
if(strcmp($_SESSION['user_ip'], $_SERVER['REMOTE_ADDR']) == 0 && session_is_registered('logged_in'))
//인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
//...
else
print "허가되지 않은 사용자 입니다.";
exit;

?>

=========================================================

□ JSP

o 취약한 프로그래밍 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.* " %>
//login_ok.jsp// 사용자 로그인 처리를 하는 스크립트
<%
// form 에서 사용자 id와 사용자 password를 아래 변수로 전달
if(!myfunc_userauth(userid, userpw)) //DB 에서 사용자 인증을 처리하는 부분
out.println "인증 실패";
else
//인증에 성공한 경우 처리 해야 되는 부분
Cookie cookie1 = new Cookie("logged_in", "1");
response.addCookie(cookie1);//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
Cookie cookie2 = new Cookie("userid", userid);
response.addCookie(cookie2);
...
%>

//user_menu.jsp// 사용자 검증이 필요한 페이지
<%
Cookie[] cookies = request.getCookies();
for(int i=0; i< cookies.length; i++)
Cookie thisCookie = cookie[i];
if(thisCookie.getName.equals("logged_in"))
String logged_in = thisCookie.getValue();
if(thisCookie.getName.equals("userid"))
String userid = thisCookie.getValue();


if(logged_in.equals("1"))
out.println("인증 성공: " + userid);

%>

==========================================================

o 안전한 프로그래밍 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.* " %>
//login_ok.jsp// 사용자 로그인 처리를 하는 스크립트
<%
//HttpSession session = request.getSession(true);
// form 에서 사용자 id와 사용자 password를 아래 변수로 전달
if(!myfunc_userauth(userid, userpw)) //DB 에서 사용자 인증을 처리하는 부분
out.println "인증 실패";
else
//인증에 성공한 경우 처리 해야 되는 부분
session.putValue('logged_in',"1");
session.putValue('userid',userid);
session.putValue('user_ip',request.getRemoteAddr());
...
%>

//user_menu.jsp// 사용자 검증이 필요한 페이지
<%
//HttpSession session = request.getSession(true);
String user_ip = session.getValue("user_ip");

if(user_ip.equals(request.getRemoteAddr()) && logged_in.equals("1"))
//인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
//...
else
out.println "허가되지 않은 사용자 처리.";

%>

=======================================================

###############################################

악의적인 명령 실행(XSS) - 소스

###############################################

□ ASP

o 취약한 프로그래밍 예

<%
Set objDBConn = Server.CreateObject("ADODB.Connection")' 게시물 읽기
Set objRs = Server.CreateObject("ADODB.RecordSet")
objDBConn.Open "board", "user", "passwd"

query = "SELECT id, name, memo FROM board_tbl WHERE id=1"
objRs.Open query, objDBConn

memo = objRs("memo")
Response.write "게시물 내용-" & memo & "<BR>"' DB에서 게시판의 내용 출력

============================================================

o 안전한 프로그래밍 예

If use_html Then' HTML tag를 사용하게 할 경우 부분 허용
memo = Server.HTMLEncode(memo) 'HTML tag를 모두 제거

' 허용할 HTML tag만 변경
memo = replace(memo, "&lt;p&gt;", "<p>")
memo = replace(memo, "&lt;P&gt;", "<P>")
memo = replace(memo, "&lt;br&gt;", "<br>")
memo = replace(memo, "&lt;BR&gt;", "<BR>")

Else' HTML tag를 사용하지 못하게 할 경우
memo = Server.HTMLEncode(memo)' HTML encoding 수행
memo = replace(memo, "<", "&lt;")
memo = replace(memo, ">", "&gt;")
End If

Response.write "게시물 내용-" & memo & "<BR>"

============================================================

□ PHP

o 취약한 프로그래밍 예

$query = "SELECT id, name, memo FROM board_tbl WHERE id=1";// 게시물 읽기
$result = mysql_query($query, $connect);

while($row = mysql_fetch_array($result))
$name = $row[name];
$memo = $row[memo];
echo "게시물 내용-" . $memo . "<BR>\n";// DB에서 게시판의 내용을 출력

=============================================================

o 안전한 프로그래밍 예

$use_tag = "img,font,p,br";// 허용할 HTML tag

if($use_html == 1) // HTML tag를 사용하게 할 경우 부분 허용
$memo = str_replace("<", "&lt;", $memo);// HTML TAG를 모두 제거

$tag = explode(",", $use_tag);
for($i=0; $i<count($tag); $i++) // 허용할 TAG만 사용 가능하게 변경
$memo = eregi_replace("&lt;".$tag[$i]." ", "<".$tag[$i]." ", $memo);
$memo = eregi_replace("&lt;".$tag[$i].">", "<".$tag[$i].">", $memo);
$memo = eregi_replace("&lt;/".$tag[$i], "</".$tag[$i], $memo);

else // HTML tag를 사용하지 못하게 할 경우

// $memo = htmlspecialchars($memo);
// htmlspecialchars() 사용시 일부 한글이 깨어지는 현상이 발생 할 수 있음

$memo = str_replace("<", "&lt;", $memo);
$memo = str_replace(">", "&gt;", $memo);


echo "게시물 내용-" . $memo . "<BR>\n";

===========================================================

□ JSP

o 취약한 프로그래밍 예

Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs=null;

String query = "SELECT memo FROM board_tbl WHERE id=1";
rs = stmt.executeQuery(query);
String memo = rs.getString(1);
out.print("게시물 내용-" + memo + "<BR>");

===========================================================

o 안전한 프로그래밍 예

if(use_html) // HTML tag를 사용하게 할 경우 부분 허용
memo = memo.replaceAll("<","&lt;");//HTML tag를 모두 제거
memo = memo.replaceAll(">","&gt;");

// 허용할 HTML tag만 변경
memo = memo.replaceAll("&lt;p&gt;", "<p>");
memo = memo.replaceAll("&lt;P&gt;", "<P>");
memo = memo.replaceAll("&lt;br&gt;", "<br>");
memo = memo.replaceAll("&lt;BR&gt;", "<BR>");

else // HTML tag를 사용하지 못하게 할 경우
memo = memo.replaceAll("<","&lt;");
memo = memo.replaceAll(">","&gt;");

out.print("게시물 내용-" + memo + "<BR>");

===========================================================

###################################################

버퍼 오버플로우 - 소스

###################################################

□ strcpy() 함수의 대체

o 취약한 프로그래밍 예

void func(char *str) {
char buffer[256];
strcpy(buffer, str);
return;
}

============================================================

o 안전한 프로그래밍 예

void func(char *str) {
char buffer[256];
strncpy(buffer, str, sizeof(buffer)-1);
buffer[sizeof(buffer)-1] = 0;
return;
}

=============================================================

□ strcat() 함수의 대체

o 취약한 프로그래밍 예

void func(char *str) {
char buffer[256];
strcat(buffer, str);
return;
}

==============================================================

o 안전한 프로그래밍 예

void func(char *str) {
char buffer[256];
strncat(buffer, str, sizeof(buffer)-1);
return;
}

==============================================================

□ sprintf() 함수의 대체

o 취약한 프로그래밍 예

void func(char *str) {
char buffer[256];
sprintf(buffer, "%s", str);
return;
}
========================================================

□ gets() 함수의 대체

o 취약한 프로그래밍 예

void func(char *str) {
char buffer[256];
gets(buffer);
return;
}

========================================================

o 안전한 프로그래밍 예

void func(char *str) {
char buffer[256];
fgets(buffer, sizeof(buffer)-1, stdin);
return;
}

========================================================

□ scanf(), sscanf(), fscanf() 함수의 대체

o 취약한 프로그래밍 예

void func() {
char buffer[256];
int num;
num = fscanf(stdio, "%s", buffer); char buffer[256];
return;
}

========================================================

o 안전한 프로그래밍 예

void func() {
char buffer[256];
int num;
num = fscanf(stdio, "%255s", buffer);
return;
}

========================================================

□ C로 개발한 프로그램

o 버퍼오버플로우 취약점 예제

#include <stdio.h>
#include <string.h>
#define FILENAME "/usr/local/apache/cgi-bin/counter.dat"

int main() {
FILE *fp;
int counter=0;
char envc[255], *env;

env = getenv("HTTP_USER_AGENT");

printf("Content-Type: text/html \n\n");

if (!env)
exit(1);

strcpy(envc, env);
strtok(envc," ");

if((fp=fopen(FILENAME,"rt")) == NULL ) exit(1);
fscanf(fp,"%d",&counter);
fclose(fp);
printf("<FONT size=2><B>VISIT</B>: %d / <B>BROWSER</B>: %s</FONT>\n",counter, envc);

if((fp=fopen(FILENAME,"wt")) == NULL ) exit(1);
fprintf(fp,"%d\n",counter+1);
fclose(fp);

return 0;
}

======================================================

o 버퍼오버플로우 취약점 제거 예제

#include <stdio.h>
#include <string.h>
#define FILENAME "/usr/local/apache/cgi-bin/counter.dat"

int main() {
FILE *fp;
int counter=0;
char envc[255], *env;

env = getenv("HTTP_USER_AGENT");
printf("Content-Type: text/html \n\n");

if (!env)
exit(1);


strncpy(envc, env, sizeof(envc)-1);
strtok(envc," ");

if((fp=fopen(FILENAME,"rt")) == NULL ) exit(1);
fscanf(fp,"%d",&counter);
fclose(fp);
printf("<FONT size=2><B>VISIT</B>: %d / <B>BROWSER</B>: %s</FONT>\n",counter, envc);


if((fp=fopen(FILENAME,"wt")) == NULL ) exit(1);
fprintf(fp,"%d\n",counter+1);
fclose(fp);

return 0;
}

======================================================

##############################################

악의적인 명령어 주입 공격 (SQL Injection) - 소스

##############################################

□ ASP

o 취약한 SQL Injection 예제

prodId = Request.QueryString("productId")

Set conn = server.createObject("ADODB.Connection")
Set rs = server.createObject("ADODB.Recordset")

query = "select prodName from products where id = " & prodId

conn.Open "Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=productDB; User Id=dbid; Password="
rs.activeConnection = conn
rs.open query

If not rs.eof Then
response.write "제품명" & rs.fields("prodName").value
Else
response.write "제품이 없습니다"
End If

=======================================================

o 안전한 SQL Injection 예제

prodId = Request.QueryString("productId")
prodId = replace(prodId, "'", "''")' 특수문자 제거
prodId = replace(prodId, ";", "")
set conn = server.createObject("ADODB.Connection")
set rs = server.createObject("ADODB.Recordset")
query = "select prodName from products where id = " & prodId
conn.Open "Provider=SQLOLEDB; Data Source=(local);
Initial Catalog=productDB; User Id=dbid; Password="
rs.activeConnection = conn
rs.open query
If not rs.eof Then
response.write "제품명" & rs.fields("prodName").value
Else
response.write "제품이 없습니다"
End If

=======================================================

□ PHP

o 취약한 SQL Injection 예제

$query = "SELECT id, password, username FROM user_table WHERE id='$id'";
// 사용자로부터 입력받은 id 값을 사용자 table에서 조회
$result = OCIParse($conn, $query);
if (!OCIExecute($result))
echo "<META http-equiv=\"refresh\" content=\"0;URL=http://victim.com\">";
// 메인 페이지로 redirect

OCIFetchInto($result, &$rows);
... 중략 ...

=======================================================

o 안전한 SQL Injection 예제

$query = sprintf("SELECT id,password,username FROM user_table WHERE id='%s';",addslashes($id));
// id변수를 문자형으로 받고, id변수의 특수문자를 일반문자로 변환한다.

// @ 로 php 에러 메시지를 막는다.
$result = @OCIParse($conn, $query);
if (!@OCIExecute($result))
error("SQL 구문 에러");
exit;

@OCIFetchInto($result,&$rows);
... 중략 ...

========================================================

□ JSP

o 취약한 SQL Injection 예제

String sql = "SELECT * FROM user_table" + " WHERE id = " + response.getParameter("id") + " AND password = " + response.getParameter("password");

Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);

stmt = conn.createStatement();
rs = stmt.executeQuery(query);

while(rs.next())

========================================================

o 안전한 SQL Injection 예제

String sql = "SELECT * FROM user_table" + " WHERE id = ?" + " AND password = ?";
ResultSet rs = null;
PreparedStatement pstmt = null;
try
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);

pstmt.setString(1, request.getParameter("id"));
pstmt.setString(2, request.getParameter("password"));

rs = pstmt.executeQuery();

=========================================================

#################################################

업로드 취약점 - 소스

#################################################

□ ASP

o 취약한 파일 업로드 예

<%
Set Up = Server.CreateObject("SiteGalaxyUpload.Form")

uploadPath = server.mappath(".") & "\upload\"' 업로드 디렉토리

Fname = Up("file1")
if Fname <> "" then'파일 첨부가 되었으면
fileName=Mid(Fname,InstrRev(Fname,"\")+1)'파일이름부분 추출
savePath = uploadPath & fileName

Set fso = CreateObject("Scripting.FileSystemObject")
Up("file1").SaveAs(savePath)
response.write(savePath & " 저장 완료")
else
response.write("Error")
end if

Set Up = nothing
%>

========================================================

o 안전한 파일 업로드 예

<%
Set Up = Server.CreateObject("SiteGalaxyUpload.Form")
Path1 = server.mappath(".") & "\upload\"

Fname = Up("file1")

if Fname <> "" then'파일 첨부가 되었으면

if Up("file1").Size > 10240 then' 용량 제한
Response.Write "용량 초과"
Response.End
end if

if Up("file1").MimeType <> "image" then' 이미지만 업로드 허용
Response.Write "이미지 파일이 아닙니다."
Response.End
end if

Filename=Mid(Fname,InstrRev(Fname,"\")+1)'파일이름부분 추출

' 중복시에 파일이름부분을 변경하기 위해 분리를 한다
Farry=split(Filename,".")'.을 기준으로 분리
preFname=Farry(0)'파일이름 앞부분
extFname=Farry(1)'파일의 확장자

' 저장할 전체 path를 만든다, 파일이름을 구한다
Path2 = Path1 & Filename
saveFname=preFname & "." & extFname


Set fso = CreateObject("Scripting.FileSystemObject")
countNo = 0' 파일 중복될경우 셋팅 값
fExist=0' 같은 이름의 파일 존재 체크

Do until fExist = 1
If(fso.FileExists(Path2)) Then
countNo = countNo + 1
Path2 = Path1 & preFname & countNo & "." & extFname
saveFname=preFname & countNo & "." & extFname
else
fExist=1
End If
Loop

Up("file1").SaveAs(Path2)
response.write(saveFname & " 저장완료")
else
response.write("Error")
end if

Set Up = nothing
%>

=====================================================================

□ PHP

o 취약한 파일 업로드 예

<?php
$uploaddir = '/var/www/uploads/';

$uploadfile = $uploaddir. $_FILES['userfile']['name'];

if(copy($_FILES['userfile']['tmp_name'], $uploadfile))
print "성공적으로 업로드 되었습니다.";
print_r($_FILES);
else
print "파일 업로드 실패";
print_r($_FILES);

?>

=====================================================================

o 안전한 파일 업로드 예

<?php
$uploaddir = '/var/www/uploads/';

//파일 사이즈가 0byte 보다 작거나 최대 업로드 사이즈보다 크면 업로드를 금지 시킨다.
if($_FILES['userfile']['name'])
if($_FILES['userfile']['size'] <= 0) // 최대 업로드 사이즈 체크 삽입
print "파일 업로드 에러";
exit;

//파일 이름의 특수문자가 있을 경우 업로드를 금지 시킨다.
if (eregi("[^a-z0-9\._\-]",$_FILES['userfile']['name']))
print "파일 이름의 특수문자 체크";
exit;

//파일 확장자중 업로드를 허용할 확장자를 정의한다.
$full_filename = explode(".", $_FILES['userfile']['name']);
$extension = $full_filename[sizeof($full_filename)-1];

/* PHP의 경우 확장자 체크를 할 때 strcmp(확장자,"php3"); 로 체크를 하게 되면
pHp3 이나 phP3는 구별을 하지 못하게 되므로 strcasecmp처럼 대소문자 구별을 하지
않고 비교하는 함수를 사용한다. 또한 .를 기준으로 하여 확장자가 하나로 간주하고
프로그램을 할 경우 file.zip.php3 이라고 올린다면 zip파일로 인식하고 그냥 첨부가
되므로 아래와 같이 제일 끝에 존재하는 확장자를 기준으로 점검하도록 한다. */

$extension= strtolower($extension);
if (!( ereg($extension","hwp") || ereg($extension","pdf") || ereg($extension","jpg")) )
print "업로드 금지 파일 입니다";
exit;


$uploadfile = $uploaddir. $_FILES['userfile']['name'];
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
print "파일이 존재하고, 성공적으로 업로드 되었습니다.";
print_r($_FILES);
else
print "파일 업로드 공격의 가능성이 있습니다! 디버깅 정보입니다:\n";
print_r($_FILES);

?>

=====================================================================

□ JSP

o 취약한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ;// 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames();// 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName);// 파일의 이름 얻기

if(fileName == null)
out.print("Error");
else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr");
out.print("User Name : " + multi.getParameter("userName") + "<BR>");
out.print("Form Name : " + formName + "<BR>");
out.print("File Name : " + fileName);


catch(Exception e)
out.print("Error");

%>

=====================================================================

o 안전한 파일 업로드 예

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
<%
String savePath="/var/www/uploads";// 업로드 디렉토리
int sizeLimit = 5 * 1024 * 1024 ; // 업로드 파일 사이즈 제한

try
MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());
Enumeration formNames=multi.getFileNames(); // 폼의 이름 반환
String formName=(String)formNames.nextElement();
String fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기

String file_ext = fileName.substring(fileName.lastIndexOf('.') + 1);
if(!( file_ext.equalsIgnoreCase("hwp") || file_ext.equalsIgnoreCase("pdf") || file_ext.equalsIgnoreCase("jpg")) )
out.print("업로드 금지 파일");


if(fileName == null)
out.print("파일 업로드 실패");
else
fileName=new String(fileName.getBytes("8859_1"),"euc-kr"); // 한글인코딩
out.print("File Name : " + fileName);

catch(Exception e)

===========================================================

###################################################

다운로드 취약점 - 소스

###################################################

□ ASP

o 취약한 파일 다운로드 예

<%
file = Request.Form ("file")'파일 이름

Response.ContentType = "application/unknown"'ContentType 선언
Response.AddHeader "Content-Disposition","attachment; filename=" & file

Set objStream = Server.CreateObject("ADODB.Stream")'Stream 이용

objStream.Open
objStream.Type = 1
objStream.LoadFromFile Server.MapPath("./upfiles/")&"\"& file '서버 절대경로

download = objStream.Read
Response.BinaryWrite download

Set objStream = nothing'객체 초기화

==========================================================

o 안전한 파일 다운로드 예제

<%
file = Request.Form ("file")'파일 이름

Response.ContentType = "application/unknown"'ContentType 선언
Response.AddHeader "Content-Disposition","attachment; filename=" & file

Set objStream = Server.CreateObject("ADODB.Stream")'Stream 이용

strFile = Server.MapPath("./upfiles/") & "\" & file '서버 절대경로
strFname=Mid(Fname,InstrRev(file,"\")+1) '파일 이름 추출, ..\ 등의 하위 경로 탐색은 제거 됨
strFPath = Server.MapPath("./upfiles/") & "\" & strFname '웹서버의 파일 다운로드 절대 경로

If strFile = strFPath Then'사용자가 다운 받는 파일과 웹서버의 파일 다운로드 경로가 맞는지 비교
objStream.Open
objStream.Type = 1
objStream.LoadFromFile strFile

download = objStream.Read
Response.BinaryWrite download
End If
Set objstream = nothing'객체 초기화
%>

==========================================================

□ PHP

o 취약한 파일 다운로드 예

$dn_path = "/var/www/data/$up_dir/$dn_file_name";

//파일 전송 루틴
header("Content-Type: doesn/matter");
header("Content-Length: ".filesize("$dn_path"));
header("Content-Disposition: filename=".$dn_file_name]);
header("Content-Transfer-Encoding: binary\r\n");
header("Pragma: no-cache");
header("Expires: 0");

==========================================================

o 안전한 파일 다운로드 예

if (preg_match("/[^a-z0-9_-]/i",$up_dir))
print "디렉토리에 특수문자 체크";
exit;

if (preg_match("/[^\xA1-\xFEa-z0-9._-]|\.\./i",urldecode($dn_file_name)))
print "파일이름에 특수문자 체크";
exit;

$dn_path = "/var/www/data/$up_dir/$dn_file_name";
if (!file_exists($dn_path))
print "파일이 존재여부 체크";
exit;

//파일 전송 루틴
header("Content-Type: doesn/matter");
header("Content-Length: ".filesize("$dn_path"));
header("Content-Disposition: filename=".$dn_file_name]);
header("Content-Transfer-Encoding: binary\r\n");
header("Pragma: no-cache");
header("Expires: 0");

===========================================================

□ JSP

o 취약한 파일 다운로드 예

String UPLOAD_PATH= "/var/www/upload/";
String filename= response.getParameter("filename");
String filepathname = UPLOAD_PATH + filename;

// 파일 전송 루틴
response.setContentType("application/unknown; charset=euc-kr");
response.setHeader("Content-Disposition","attachment;filename=" + filename + ";");
response.setHeader("Content-Transfer-Encoding:" , "base64");

BufferedInputStream in = new BufferedInputStream(new FileInputStream(filepathname));

==========================================================

o 안전한 파일 다운로드 예

String UPLOAD_PATH= "/var/www/upload/";
String filename= response.getParameter("filename");
String filepathname = UPLOAD_PATH + filename;

if(filename.equalsIgnoreCase("..") || filename.equalsIgnoreCase("/"))
// 파일 이름 체크
return 0;

// 파일 전송 루틴
response.setContentType("application/unknown; charset=euc-kr");
response.setHeader("Content-Disposition","attachment;filename=" + filename + ";");
response.setHeader("Content-Transfer-Encoding:" , "base64");

try
BufferedInputStream in = new BufferedInputStream(new FileInputStream(filepathname));
.........
catch(Exception e)
// 에러 체크 [파일 존재 유무등]

==========================================================

##################################################

개발 언어별 로그인 인증 프로세스 예제

##################################################

1. ASP 예제
가. login.html

<html>
<head>
<title> Login </title>
<script>
function check_submit()
if(!login.user_id.value)
alert("아이디를 입력하세요");
login.user_id.focus();
return false;

if(!login.password.value)
alert("아이디를 입력하세요");
login.password.focus();
return false;

return true;

</script>
</head>
<body>
<form method=post action=login.asp onsubmit="return check_submit();" name=login>
<TABLE border=0>
<TR>
<TD>아이디</TD>
<TD><input type=text name="user_id" value="" maxlength=12 size=19></TD>
</TR>
<TR>
<TD>패스워드</TD>
<TD><input type=password name="password" value="" maxlength=12 size=19><input type=submit value="login"></TD>
</TR>
</TABLE>
</form>
</body>
</html>

===========================================================

나. login.asp

<% Option Explicit %>
<%
Dim user_id, password
user_id = Request.Form("user_id")' 사용자로부터 입력 받은 아이디
password = Request.Form("password")' 사용자로부터 입력 받은 패스워드

If UserAuth(user_id, password) <> 1 Then
Response.redirect("/login.html")' 인증 실패시 인증 페이지로 Redirect
Else
If Session("logged_in") <> 1 Then' 인증된 사용자 인지 체크
Session("logged_in") = 1' 인증에 성공했을경우 logged_in 에 1의 값을 셋팅
Session("user_id") = user_id' 사용자 ID 저장
Session("user_ip") = Request.Servervariables("REMOTE_ADDR")' IP 저장
End If
Response.redirect("/main.asp")' 인증 성공시 Main 페이지로 Redirect
End If
%>

<%
Function stripQuotes(strWords)
stripQuotes = replace(strWords, "'", "''")' 특수문자 제거
End Function

Function UserAuth(user_id, user_pwd)' 사용자 인증
Dim objConn, objRs
Dim strConnection, strQuery

Set objConn = Server.CreateObject("ADODB.Connection")
Set objRs = Server.CreateObject("ADODB.RecordSet")

' DB 연결 정보, 별도의 헤더 파일로 관리하여 INCLUDE
strConnection = "DSN=MEMBER;uid=DBUSER;pwd=DBPASSWD"

On Error Resume Next' 에러가 생길경우
objConn.Open strConnection
objRs.ActiveConnection = objConn

strQuery = "SELECT * FROM user_tbl WHERE user_id= '" &_
stripQuotes(user_id) & "' AND password='" &_
stripQuotes(user_pwd) & "'"
objRs.Open strQuery

If objRs.BOF or objRs.EOF Then' 올바른 사용자를 찾지 못했을경우
UserAuth = 0
Else
UserAuth = 1
End If

objRs.Close' DB 연결 해제
Set objRs = Nothing
objConn.Close
Set objConn = Nothing
End Function

===========================================================

다. main.asp

<%
If Session("user_ip") = Request.Servervariables("REMOTE_ADDR") AND Session("logged_in") = 1 Then
Response.Write Session("user_id") & "님은 " & Session("user_ip") & "에서 접속하셨습니다."
'인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
'... 중략 ...
Else
Response.write "허가되지 않은 사용자 입니다."
End If
%>

===========================================================

2. PHP

가. login.html

<html>
<head>
<title> Login </title>
<script>
function check_submit()
if(!login.user_id.value)
alert("아이디를 입력하세요");
login.user_id.focus();
return false;

if(!login.password.value)
alert("아이디를 입력하세요");
login.password.focus();
return false;

return true;

</script>
</head>
<body>
<form method=post action=login.php onsubmit="return check_submit();" name=login>
<TABLE border=0>
<TR>
<TD>아이디</TD>
<TD><input type=text name="user_id" value="" maxlength=12 size=19></TD>
</TR>
<TR>
<TD>패스워드</TD>
<TD><input type=password name="password" value="" maxlength=12 size=19><input type=submit value="login"></TD>
</TR>
</TABLE>
</form>
</body>
</html>

===========================================================

나. login.php

<?PHP
@session_cache_limiter('nocache');
@session_start(); //세션 데이터를 초기화

// form 에서 사용자 id와 사용자 password를 아래 변수로 전달
if(!UserAuth($_POST['user_id'],$_POST['password'])) //DB 에서 사용자 인증 처리하는 부분
header("Location: login.html");
exit;//인증 실패시 종료

//인증에 성공한 경우 처리 해야 되는 부분
if (!session_is_registered("logged_in"))

$logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
$user_id = $_POST["user_id"];
$user_ip = $_SERVER["REMOTE_ADDR"];
session_register("logged_in");//인증 결과 저장
session_register("user_id");//사용자 ID를 저장
session_register("user_ip");//사용자 IP를 저장

header("Location: main.php");
?>
<?PHP
function UserAuth($userid, $userpwd)
$connect = mysql_connect("localhost","DBUSER","DBPASSWD");
mysql_select_db("MEMBER");

$strQuery = "SELECT * FROM user_tbl WHERE user_id ='" . addslashes($userid) . "' AND password='" . addslashes($userpwd) . "'";
$result = @mysql_query($strQuery);
if($result)
if(mysql_num_rows($result))
$data = mysql_fetch_array($result);
$userLevel = $data["level"];
@mysql_free_result($result);
@mysql_close($connect);
return 1;

return 0;
@mysql_close($connect);
return 0;
?>

===========================================================

다. main.php

<?PHP
@session_start();
if(strcmp($_SESSION['user_ip'], $_SERVER['REMOTE_ADDR']) == 0 && session_is_registered('logged_in'))
//인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
//... 중략 ...
echo $_SESSION['user_id'] . "님은 " . $_SESSION['user_ip'] . "에서 접속하셨습니다.";
else
echo "허가되지 않은 사용자 입니다.";
exit;

?>

==========================================================

3. JSP

가. login.html

<html>
<head>
<title> Login </title>
<script>
function check_submit()
if(!login.user_id.value)
alert("아이디를 입력하세요");
login.user_id.focus();
return false;


if(!login.password.value)
alert("아이디를 입력하세요");
login.password.focus();
return false;

return true;

</script>
</head>
<body>
<form method=post action=login.jsp onsubmit="return check_submit();" name=login>
<TABLE border=0>
<TR>
<TD>아이디</TD>
<TD><input type=text name="user_id" value="" maxlength=12 size=19></TD>
</TR>
<TR>
<TD>패스워드</TD>
<TD><input type=password name="password" value="" maxlength=12 size=19><input type=submit value="login"></TD>
</TR>
</TABLE>
</form>
</body>
</html>

==========================================================

나. login.jsp

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*" %>
<%@ page import="java.sql.* " %>

<%
String DB_URL = "jdbc:mysql://127.0.0.1/MEMBER";// DB 연결 정보, 별도의 헤더 파일로 관리하여 INCLUDE
String DB_USER = "DBUSER";
String DB_PASSWORD= "DBPASSWD";

//HttpSession session = request.getSession(true);// Servlet 의 경우만 추가
String user_ip = request.getRemoteAddr();// 연결된 사용자의 IP 획득
String user_id = null;

Connection conn;
PreparedStatement pstmt = null;
ResultSet rs = null;

try
Class.forName("org.gjt.mm.mysql.Driver");// 드라이버 등록
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);// DB연결
String query = "SELECT * FROM user_tbl WHERE user_id = ? AND password = ?";
pstmt = conn.prepareStatement(query);

pstmt.setString(1, request.getParameter("user_id"));// 사용자 입력값 전달
pstmt.setString(2, request.getParameter("password"));

rs = pstmt.executeQuery();
if(rs.next())
user_id = rs.getString(1);// DB에서 사용자 정보 획득


if(user_id != null)
if(session.getValue("logged_in") != "1") // 인증된 사용자 인지 체크
session.putValue("logged_in", "1");// SESSION에 사용자 정보 기록
session.putValue("user_id", user_id);
session.putValue("user_ip", user_ip);

//LogSave(user_id, user_ip);// 인증에 성공한 사용자 정보 기록

response.sendRedirect("/main.jsp");// 인증 성공시 Main 페이지로 Redirect
else
response.sendRedirect("/login.html");// 인증 실패시 인증 페이지로 Redirect

catch(Exception ex) // 에러처리
out.println(ex);
finally // DB연결 종료
if(rs != null) try rs.close(); catch(SQLException ex)
if(pstmt != null) try pstmt.close(); catch(SQLException ex)

%>

==========================================================

나. main.jsp

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*" %>

<%
//HttpSession session = request.getSession(true);

if(session.getValue("user_ip") == request.getRemoteAddr() && session.getValue("logged_in") == "1")
//인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
//...
out.println(session.getValue("user_id") + " 님은 " + session.getValue("user_ip") + " 에서 접속하셨습니다.");
//... 중략 ...
else
response.sendRedirect("/login.html");// 인증 실패시 인증 페이지로 Redirect

%>

===========================================================

 

http://blog.naver.com/jaisonyi/40027002213

Posted by 물색없는세상
2013. 3. 20. 17:59
var url = "http://stackoverflow.com";    
$
(location).attr('href',url);

 

http://blog.yes24.com/blog/blogMain.aspx?blogid=metalzang&artseqno=6289726

Posted by 물색없는세상
2013. 3. 15. 01:23

안녕하세요.. ^^

파일 업로드 찾다가 요기까지 왔네요.. ^^

샘플코드는 잘 봤습니다..

(샘플코드에 변수이름이 조금 잘못 되어 있는 부분이 있었습니다. - 큰문제는 아니죠.. ^^)

파일 업로드를 구현하면서 어려움(?)을 겪었던 부분과 해결 부분을 적어보려 합니다.

(저도 도움을 받았으니, 혹시나 저와 같은 어려움(?) 을 겪으신 분들을 위하여.. ^^)

* OS : Linux
* DB : Oracle
* WAS : OC4J 10g AS

/**
* form tag의 input name들이 아래와 같이 있습니다.
*/

String sMode = "";

String sPageNo = "";
String sKeyWord = "";
String sSearchPart = "";
String sSeqNum = "";

String sAnsTitle = "";
String sAnsContent = "";

String sFileName = "";
String sTmpFileName = "";

try {

//Multipart로 넘어왔는가?
if (FileUpload.isMultipartContent(req)) {

DiskFileUpload dfuUpload = new DiskFileUpload();

/**
* 이 부분 상당히 애를 먹었습니다.
* Windows 환경에서는 문제가 없는데,
* 개발 서버(Linux)로 올리게 되면 계속해서 한글이 깨지더군요.
*
* 그래서, 아래와 같이 DiskFileUpload의 HearderEncoding을 해주었습니다.
*/

dfuUpload.setHeaderEncoding("EUC_KR");

List lsItems = dfuUpload.parseRequest(req);
Iterator iterator = lsItems.iterator();

while (iterator.hasNext()) {

FileItem fItem = (FileItem) iterator.next();

/**
* 넘어오는 form이 multipart일때도 있고 아닐 경우도 있어서
* 처리한 부분입니다.
*
* HashMap을 사용해서 put한 다음에, 필요할때 꺼내 써도 무방할듯 합니다.
*/

if ("mode".equals(fItem.getFieldName())) {
sMode = fItem.getString();
} else if ("pageNo".equals(fItem.getFieldName())) {
sPageNo = fItem.getString();
} else if ("keyWord".equals(fItem.getFieldName())) {
//한글처리
sKeyWord = fItem.getString("EUC_KR");
} else if ("searchPart".equals(fItem.getFieldName())) {
sSearchPart = fItem.getString();
} else if ("seqNum".equals(fItem.getFieldName())) {
sSeqNum = fItem.getString();
} else if ("ansTitle".equals(fItem.getFieldName())) {
//한글처리
sAnsTitle = fItem.getString("EUC_KR");
} else if ("ansContent".equals(fItem.getFieldName())) {
//한글처리
sAnsContent = fItem.getString("EUC_KR");
}

//파일 타입 폼필드라면
if (!fItem.isFormField()) {

if (fItem.getSize() > 0) {
//파일 이름을 가져온다
//- 위에서 dfuUpload.setHeaderEncoding("EUC_KR")를 안해 줬더니

// 파일이름이 자꾸 깨지더군요.
sFileName = fItem.getName().substring(fItem.getName().lastIndexOf("\\") + 1);

try {
/**
* upload변수는 servlet에서 init 할때 아래와 같이 선언해 주었습니다.
* upload = config.getServletContext().getRealPath("/upload/suggest/");
*/

File file = new File(upload + sFileName);
fItem.write(file);
} catch (IOException e) {
System.out.println(e);
}
}
}

}

} else {
//multipart가 아닐때 사용되는 parameter들을 가지고 옴

//WebUtil은 null Check를 위한 util입니다. - 빼도 상관없습니다.
sMode = WebUtil.nvl((String) req.getParameter("mode"), "");
sPageNo = WebUtil.nvl((String) req.getParameter("pageNo"), "");
sKeyWord = WebUtil.nvl((String) req.getParameter("keyWord"), "");
sSearchPart = WebUtil.nvl((String) req.getParameter("searchPart"), "");
sSeqNum = WebUtil.nvl((String) req.getParameter("seqNum"), "");
sAnsTitle = WebUtil.nvl((String) req.getParameter("ansTitle"), "");
sAnsContent = WebUtil.nvl((String) req.getParameter("ansContent"), "");

}
} catch (Exception e) {
LogManager.getLogger("error").error(e.toString());
}

 

http://levin01.blog.me/100011050050

'ApplicationPrograming > Java' 카테고리의 다른 글

[HttpURLConnection] POST로 파라미터 넘기기  (0) 2015.04.24
자바 암호화  (0) 2015.02.25
Commons-DbUtils  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
JDOM  (0) 2013.01.31
Posted by 물색없는세상
2013. 3. 15. 01:21

Commons-DbUtils

I. 어디서 다운을 받나요?

http://jakarta.apache.org/site/downloads/downloads_commons-dbutils.cgi

II. 설치는 어떻게 하나요?

다운 받은 commons-beanutils.jar는 자신의 /WEB-INF/lib/ 에 복사합니다

III. DbUtils란 무엇인가요?

DbUtils는 JDBC 작업을 좀더 쉽게 할수있도록 해주는 작은 클래스 집합입니다.

IV. 왜 DbUtils를 사용해야 하는가요?

① resource 누출에 대한 어떠한 가능성도 없습니다
JDBC코딩을 하는데 있어서 쉽지않고 양도 만만치 않으며 지루해 지기 쉽습니다
이러다 보면 자기도 모르게 Connection 누수를 발생시킬수 있는데 이러한 가능성을 배재해 줍니다


② 코드의 가독성이 높아집니다
데이터베이스 처리하는데 필요한 코드의 양을 절대적으로 줄여야 합니다.
남아있는 코드로 당신의 의도를 정확하게 나타내어야 합니다.


③ ResultSet으로 부터 JavaBean property로 세팅을 해줍니다!
더이상 setter메소드를 이용하여 ResultSet으로부터 컬럼값을 가져오는 코딩을 하지 않아도 됩니다
ResultSet 각각의 row는 bean instance의 에 완벽하게 전달해 줍니다

V. 어떻게 사용하나요?

Connection, Statement, ResultSet 의 close를 간단하게!

이럴때는 org.apache.commons.dbutils.DbUtils 클래스를 이용하자!

이 클래스는 모두 static 메소드들로 구성되어있습니다

사용예)

DbUtils.close(conn);
DbUtils.close(stmt);
DbUtils.close(rs);
DbUtils.closeQuietly(conn);
DbUtils.closeQuietly(stmt);
DbUtils.closeQuietly(rs);
DbUtils.closeQuietly(conn, stmt, rs);
DbUtils.commitAndClose(conn);

DbUtils.commitAndCloseQuietly(conn);
DbUtils.loadDriver("com.mysql.jdbc.Driver");
DbUtils.rollback(conn);

closeQuietly 메소드처럼 뒤에 Quietly라고 붙어 있는 메소드는 익셉션 처리는 자체적으로 처리합니다,

즉 자신을 call한곳으로 throw 하지 않습니다

commitAndCloses는 connection을 commit 후 close 하며 rollback는 connection을 rollback 합니다

loadDriver 는 JDBC 드라이버를 로딩 합니다

파일로 저장된 SQL을 사용하자!

이럴 때는 org.apache.commons.dbutils.QueryLoader 클래스를 이용합니다

이 클래스는 SingleTone 패턴의 클래스입니다

즉 파일로 저장된 SQL을 읽어 HashMap으로 로드하는 클래스 입니다

사용예)

QueryLoader queryloader = QueryLoader.getInstance(); //싱글톤
HashMap hashmap = queryloader.load("sql");

queryloader.upload("sql");

queryloader는 싱클톤이므로 위와같이 객체를 얻어옵니다

load 함수는 Properties 클래스를 이용하여 sql.properties 파일을 읽어

HashMap으로 저장하여 리턴하여 줍니다

unload는 load시 따로 메모리에 저장해 놓았던 sql 정보를 해제합니다

Setter함수로 더이상 머리 아프지 말자!

이럴때는 org.apache.commons.dbutils.QueryRunner 클래스를 이용합니다

사용예)

...

BoardVO boardVO = null;

ArrayList arraylist = new ArrayList();

resultset = statement.executeQuery("SELECT * FROM board_t");

while (resultset.next()) {

boardVO = new BoardVO();

boardVO.setTitle("title");

boardVO.setContent("content");

boardVO.setWriter("writer");

arraylist.add(boardVO);

}

..

와 같은 코드는 다음과 같이 간략화 됩니다

ResultSetHandler rsh= new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();

List list = (List)queryRunner.query(conn, "SELECT * FROM board_t", rsh);

정말 간단해 집니다 만약 테이블에 컬럼이 30~40개가 된다면..

select 한문장 할려면 코드수가 몇십줄 입니다. 더이상 노가다 하지 맙시다~

QueryRunner는 다음과 같은 함수를 지원합니다

사용예)

QueryRunner queryrunner = new QueryRunner();
QueryRunner queryrunner = new QueryRunner(DataSource ds);
//datasource를 바로 이용할 수 있다

queryRunner.query(Connection conn, String sql, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object param, ResultSetHandler rsh)
queryRunner.query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)

여기서 말하는 Object param은 파라미터 전달시 사용됩니다

ArrayList params = new ArrayList();
params.add("100");

params.add("200");

ResultSetHandler rsh = new BeanListHandler(BoardVO.class);
QueryRunner queryRunner = new QueryRunner();

List list = (List)queryRunner.query(conn, "SELECT * FROM board_t WHERE boardNo > ? and boardNo < ?", params.toArray(), rsh);

select 뿐만 아니라 update, delete역시 가능합니다

사용예)

QueryRunner queryRunner = new QueryRunner();

queryRunner.update(Connection conn, String sql)
queryRunner.update(Connection conn, String sql, Object param)
queryRunner.update(Connection conn, String sql, Object params[])

ArrayList params = new ArrayList();
params.add(boardId);
queryRunner.update(connection, "UPDATE board_t SET read = read + 1 WHERE boardNo = ?", params.toArray());

와 같이 사용할 수 있습니다

VI. 샘플코드

public class DbUtilsExample() {

public static void main(String[] args) {

HashMap map = QueryLoader.getInstance().load("sql"); // (주의) load함수는 실행할때마다 파일을 읽습니다

Connection conn = null;

try {

DbUtils.loadDriver("com.mysql.jdbc.Driver");

conn = DriverManager.getConnection("jdbc:mysql://localhost/mysql", "root", "");

ArrayList params = new ArrayList();
params.add(args[0]);

ResultSetHandler rsh = new BeanListHandler(BoardVO.class);

QueryRunner qr = new QueryRunner();

List list = qr.query(conn, (String)map.get("select"), params.toArray(), rsh);

for (int i = 0; i < list.size(); i++) {

BoardVO board = (BoardV)list.get(i);

System.out.println(board.getTitle());

System.out.println(board.getContent());

System.out.println(board.getWriter());

)

} catch (Exception e) {

System.out.println(e);

} finally {

DbUtils.closeQuitely(conn);

}

}

}

 

http://levin01.blog.me/100011050694

'ApplicationPrograming > Java' 카테고리의 다른 글

자바 암호화  (0) 2015.02.25
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
JDOM  (0) 2013.01.31
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
Posted by 물색없는세상
2013. 3. 15. 01:18

Commons-Fileupload

I. Commons-fileupload 란?

커먼스의 파일 업로드 패키지는 사용법이 쉬우며 쓸만한 함수들을 많이 지원합니다.

SmartUpload, MultipartRequest, Commons fileupload등을 모두 사용해 보았지만 개인적으로 가장 애착이 가는 파일 업로드입니다.

아쉬운점은 Commons-fileupload는 지난 2003년 6월 1.0버젼으로 정식 릴리즈 되었지만 그 이후로 이렇다 할 패치나 보안이 전혀 안되었다는 것입니다. 이말은 파일 업로드 자체가 그리 복잡한 패키지가 아니며 첫 정식 버젼이 그만큼 완벽하다는 것을 반증하는 말이기도 하겠지요 ^^

II. 다운로드 및 설치

자 다운로드 받으러 갑시다.

http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi

설치는 역시나 /WEB-INF/lib/ 폴더에 복사합니다.

III. 파일 업로드 처리 단계

먼저 파일 업로드된 아이쳄을 처리하기 전에 유효한 Request인지 확인해야 합니다.

boolean isMultipart = FileUpload.isMultipartContent(request);

이 코드는 현재 request가 multipart/form-data로 데이터를 전송했는지 유무를 true/false로 반환합니다.

업로드된 아이템이 매우 작다면 메모리에서 처리합니다.

큰 아이템이라면 임시 파일을 만들어 디스크에 저장하여 처리합니다.

너무 큰 아이템이라면 당연히 거부해야 합니다.

그렇지 않고 디폴트로 설정한 메모리, 최대값의 범위를 초과하지 않는다면 업로드를 시작합니다.

② ~ ⑤ 까지를 다음과 같이 간단히 할 수 있습니다.

// 파일 업로드 핸들러를 생성
DiskFileUpload upload = new DiskFileUpload();

// 한번에 메모리에 저장할 사이즈 설정

upload.setSizeThreshold(yourMaxMemorySize);

// 파일 업로드 최대 사이즈를 설정

upload.setSizeMax(yourMaxRequestSize);

// 파일 업로드 경로를 설정
upload.setRepositoryPath(yourTempDirectory);

이제 전송된 request를 parsing하여 아이템들을 추출합니다.

List /* FileItem */ items = upload.parseRequest(request);

위에서 설정한 값들을 request parsing단위로 따로 설정 할 수 있습니다.

List /* FileItem */ items = upload.parseRequest(request,
yourMaxMemorySize, yourMaxRequestSize, yourTempDirectory);

이렇게 추출된 items를 이제 폼필드 타입에 따라 적절히 처리 합니다.

Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();

// 파일 타입이 아닌 다른 폼필드라면
if (item.isFormField()) {
processFormField(item);

// 파일 타입 폼필드라면
} else {
processUploadedFile(item);
}
}

폼필드에 따른 처리

만약 폼필드가 파일 이외의 파라미터라면 다음과 같이 처리하면 됩니다.

if (item.isFormField()) {
//파라미터 이름

String name = item.getFieldName();

//파라미터 값

String value = item.getString();
...
}

만약 폼필드가 파일 파라미터라면 다음과 같이 처리하면 됩니다.

if (!item.isFormField()) {

// 파라미터 이름
String fieldName = item.getFieldName();

// 파일 이름 (경로포함)
String fileName = item.getName();
String contentType = item.getContentType();

// 업로드한 파일이 메모리에 저장된 상태면 true, 거렇지 않고 임시 파일로 저장된 경우 false를 리턴
boolean isInMemory = item.isInMemory();

// 파일사이즈
long sizeInBytes = item.getSize();
...

// 파일 객체를 하나 만들어 업로드 완료!

File uploadedFile = new File(...);

item.write(uploadedFile);
}

파일 업로드 방식

파일 업로드 방식에는 모두 3가지가 존해합니다.

-. FileItem.write(File file);

-. FileItem.getInputStream();

-. FileItem.get()

write 는 직접적으로 업로드한 파일을 저장하는 가장 일반적이고 간단한 방식입니다.

나머지 두 방식은 스트림을 사용하여 업로드한 파일이 어떤 특별한 처리를 할 때 사용합니다. 혹은 데이터베이스에 바로 저장 할 경우에도 사용될 수 있습니다. 특히 get()은 메모리에 모두 할당하여 작업을 하니 주의를 요합니다.

VI. 샘플코드

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;

public class UploadServlet extends HttpServlet {

String upload = null;


public void init(ServletConfig config) throws ServletException {
super.init(config);
upload = config.getServletContext().getRealPath("/upload/")
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

try {

if (FileUpload.isMultipartContent(request)) {

DiskFileUpload fileUload = new DiskFileUpload();
fileUpload.setRepositoryPath(upload);
fileUpload.setSizeMax(100*1024*1024);
fileUpload.setSizeThreshold(1024*50);

List items = fileUpload.parseRequest(request);

Iterator iterator = items.iterator();
while (iterator.hasNext()) {


FileItem item = (FileItem) iterator.next();

if (!item.isFormField()) {
if (fileItem.getSize() > 0) {
//파일 이름을 가져온다
String filename = fileItem.getName().substring(fileItem.getName().lastIndexOf("\\")+1);

try {
File file = new File(upload+filename);
fileItem.write(file);
} catch (IOException e) {
System.out.println(e);
}
}
}
}
}

} catch (org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e) {

// 파일 사이즈 초과시 발생하는 익셉션
System.out.println("파일 사이즈가 100메가 보다 더 초과되었습니다");
} catch (Exception e) {
System.out.println("업로드시 예기치 못한 오류가 발생하였습니다");
}
}
}

 

http://levin01.blog.me/100011050050

'ApplicationPrograming > Java' 카테고리의 다른 글

Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
Commons-DbUtils  (0) 2013.03.15
JDOM  (0) 2013.01.31
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
랜덤 숫자 생성  (0) 2012.06.11
Posted by 물색없는세상
2013. 3. 10. 02:13

1. 들어가는 말

대체로 개발자들은 GUI 환경 보다는 명령어를 직접 입력하여 그 결과를 바로 확인할 수 있는 console환경을 선호합니다.
물론 어디까지나 대체로 그렇다는 것이니 이 부분에 대한 논의는 피하도록 하겠습니다. 우선 저 부터도 소위 말하는 CUI를
선호하는 편입니다. 특히 리눅스나 유닉스 등의 서버에 원격으로 접속하여 작업을 할 때는 거의 그렇지요.

원격접속은 통상 전용 클라이언트 프로그램을 이용하기 때문에 해당 프로그램의 옵션에서 자신이 원하는 폰트를 결정할 수
있습니다. 그렇다면 윈도에선 어떨까요? 윈도의 명령 프롬프트(cmd)에서 말입니다.



2. 윈도의 명령 프롬프트에 폰트 추가하기 전 사전지식

기본적으로 한글 폰트는 굴림체가 내정되어 있습니다. 영문 환경에선 Lucida ConsoleConsolas가 준비되어 있구요.
개인적으로 저는 <Courier New>폰트를 선호하는 편입니다. 그리고 최근엔 <나눔고딕코딩>이라는 폰트를 알게 되었구요.

어쩌면 눈치 채셨을지도 모르겠습니다. 앞에 나열한 폰트들의 공통점이요, 모두 고정폭 폰트들입니다. 콘솔에선 기본적으로
고정폭 폰트 만을 사용할 수 있도록 되어 있기 때문에 폰트를 추가하실 때 이점을 꼭 기억해두셔야 합니다.



3. RegEdit을 이용한 레지스트리 수정으로 폰트 추가

명령 프롬프트에서 사용할 폰트를 추가하시려면 레지스트를 수정해야 합니다. 시작>실행에서 regedit 이라고 입력하신 후
엔터를 누르면 레지스트리 편집 프로그램이 기동됩니다. 아래 그림을 참고 하십시오.




수정해야 할 레지스트리의 경로는 다음과 같습니다.

HKLM\Software\Microsoft\WindowsNT\CurrentVersion\Console\TrueTypeFont





해당 키에 새로운 문자열값을 입력해주면 됩니다. 다음 그림을 참고하세요. 참고로 한글 로케일 코드는 949입니다.







4. 명령 프롬프트의 속성(폰트) 변경하기

이렇게 레지스트리를 수정하였으면 명령프롬프트의 속성 창을 열어 사용하고 싶은 폰트를 지정해주시면 됩니다.
우선 명령 프롬프트에서 사용할 로케일을 먼저 선택해주시구요. 한국어로 선택을 했습니다. 참고로 레지스트리에
0, 00, 000으로 등록된 값은 437 (OEM-미국)에 해당하는 값입니다.






글꼴 탭을 보시면 전에 없던 나눔고딕코딩이라는 폰트가 보이지요? 이걸 선택하시고 폰트 크기도 적당하게 지정해주세요.
물론 당연한 것이지만 윈도에 나눔고딕코딩 폰트가 먼저 설치되어 있어야 겠지요?






결과를 확인해 보도록 하겠습니다. 우선 아래 첫번째 그림은 영문 로케일에서 Courier New폰트를 지정한 경우이구요,
두번째 그림은 한글 로케일에서 나눔고딕코딩을 지정한 경우입니다.








 






5. 짧은 글을 마치며

늘 옆에 끼고 살아야 하는 콘솔창(명령 프롬프트)을 내 입맛에 맞게 꾸밀 수 있다는 것, 즐거운 일이지요!
그리고 나눔고딕코딩 폰트가 필요하신 분은 프로젝트 홈페이지[각주:1]를 방문하셔서 다운로드 하실 수 있습니다.









  1. http://dev.naver.com/projects/nanumfont [본문으로]

http://likebnb.tistory.com/92

Posted by 물색없는세상
2013. 1. 31. 16:34

라이브러리 다운로드 : http://www.jdom.org/

★ XML 생성 순서

1. Document 생성

: Document document = new Document();

2. root Element 생성

: Element root = new Element("루트");

3. 기타 Element 생성

: Element e1 = new Element("첫번째엘리먼트");

4. Document에 root 추가

: document.setRootElement(root);

5. 상위 노드에 하위 노드 추가

: root.addContent(e1);

6. 상위 노드에 값 데이터 설정

: e1.setText("값");

결과 - 일단은 Document 타입

<?xml version="1.0" encoding="UTF-8"?>
<루트><첫번째엘리먼트>값</첫번째엘리먼트></루트>

★ XMLOutputter를 이용항 Document 객체 출력

1. XMLOutputter 객체 생성

XMLOutputter outputter = new XMLOutputter();

2. Format 객체 생성 - 가독성을 고려

Format format = outputter.getFormat();

2-1. 인코딩, 들여쓰기, 줄바꿈 설정

format.setEncoding("UTF-8");

format.setIndent("\t");

format.setLineSeparator(LineSeparator.DEFAULT);

2-2. textMode 설정

format.setTextMode(Format.TextMode.NORMALIZE);

※ PRESERVE : 원본 유지

TRIM : 좌우 여백 제거

NORMALIZE : 좌우 여백 제거 + 내부 여백을 한칸 여백으로

TRIM_FULL_WHITE :

3. XMLOutputter 에 Format 설정

outputter.setFormat(format);

4. 객체 출력

String으로 출력

: outputter.outputString(document);

표준 출력

: outputter.output(document, System.out);

파일로 출력

: outputter.output(document, new FileoutputStream("이름.확장자");

: outputter.output(document, new FileWriter("이름.확장자");

소켓으로 출력

: stream = new DataOutputStream(소켓.getOutputStream());

outputter.output(document, stream);

결과 - String 타입으로 변환. 가독성이 높아짐.

<?xml version="1.0" encoding="UTF-8"?>

<루트>

<첫번째엘리먼트>값</첫번째엘리먼트>

</루트>

 

http://blog.naver.com/comkwang17/140176506563

'ApplicationPrograming > Java' 카테고리의 다른 글

Commons-DbUtils  (0) 2013.03.15
Commons-Fileupload의 한글관련 문제 추가  (0) 2013.03.15
me2DAY XML Parsing (DOM) - 자바 XML파싱  (0) 2012.07.24
랜덤 숫자 생성  (0) 2012.06.11
jar파일 실행  (0) 2012.05.04
Posted by 물색없는세상