[시큐어코딩-7] 입력데이터 검증및 표현(7) XQuery삽입
발생원인
XQuery를 사용하는 페이지에서 입력값 검증을 하지 않은 경우 발생
영향
데이터 무단 조회, 인증절차 우회
코드예
안전하기 않은 코드의 예 - JAVA |
… // 외부로 부터 입력을 받음 String name = props.getProperty("name"); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=rootDir"); javax.naming.directory.DirContext ctx = new InitialDirContext(env); javax.xml.xquery.XQDataSource xqds = (javax.xml.xquery.XQDataSource) ctx.lookup("xqj/personnel"); Javax.xml.xquery.XQConnection conn = xqds.getConnection(); String es = "doc('users.xml')/userlist/user[uname='" +name + "']";
// 입력값이 Xquery의 인자로 사용 XQPreparedExpression expr = conn.prepareExpression(es); XQResultSequence result = expr.executeQuery(); ……
|
외부의 입력(name)값의 검증을 수행하지 않음. |
안전한 코드의 예 - JAVA |
…… // 외부로 부터 입력을 받음 String name = props.getProperty("name"); Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=rootDir"); javax.naming.directory.DirContext ctx = new InitialDirContext(env); javax.xml.xquery.XQDataSource xqds = (javax.xml.xquery.XQDataSource) ctx.lookup("xqj/personnel"); javax.xml.xquery.XQConnection conn = xqds.getConnection(); String es = "doc('users.xml')/userlist/user[uname='$xpathname']"; // 입력값이 Xquery의 인자로 사용 XQPreparedExpression expr = conn.prepareExpression(es); expr.bindString(new QName("xpathname"), name, null); XQResultSequence result = expr.executeQuery(); while (result.next()) { String str = result.getAtomicValue(); if (str.indexOf('>') < 0) { System.out.println(str); } …… |
bindString 함수로 쿼리 구조 변경 방지 |
<참고> XQuery는 XML문서의 검색과 생성을 위한 서버 사이드 솔루션으로 SQL과 유사한 구문이며 객체 지향 프로그램 언어 형식을 띤 XML을 위한 Query 언어이다.
XQuery는 웹서비스에서 사용할 수 있는 정보를 추출할때, 요약보고서를 만들어야 할 때, XML data를 XHTML로 변환할때, 관련된 정보를 웹문서에서 검색할 때 사용한다.