Java Data Objects๋ก, ์ ์ ํ ๊ฒ์ฌ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ณ JDO API์ SQL ๋๋ JDOQL ์ง์๋ฌธ ์์ฑ์ ์ํ ๋ฌธ์์ด๋ก ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ํ์ง ์์๋ ๋ฌธ์์ด์ ์ ๋ฌํด ์ง์๋ฌธ ์๋ฏธ๋ฅผ ์๊ณก์ํค๊ฑฐ๋ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์์์ ์ง์ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ ๊ฒ์ ๋งํ๋ค.
โก๏ธ ์์ ํ ์ฝ๋ฉ ๋ฐฉ๋ฒ
- JDO ์ง์๋ฌธ ์์ฑ ์ ์์ ๋ฌธ์์ด๋ง์ ์ฌ์ฉํ๊ณ , Query.execute ์คํ ์ ์ธ์๊ฐ์ ์ ๋ฌํ๋ Parameterize Query๋ฅผ ์ฌ์ฉํ๋ค.
SELECT col1 FROM MYTABLE WHERE name=' ์
๋ ฅ๋ฌธ ';
์์ ๋ช
๋ น๋ฌธ์์ ์
๋ ฅ๋ฌธ ์๋ฆฌ์ name'; DROP MYTABLE; โ
๋ฅผ ์
๋ ฅ๊ฐ์ผ๋ก ์ ๋ฌํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น๋ฌธ์ด ์คํ๋๋ค.
SELECT col1 FROM MYTABLE WHERE name = 'name'; DROP MYTABLE;โ'
๋ฐ๋ผ์ ๊ฒ์ฌ๊ณผ์ ์์ด ์
๋ ฅ๋ฌธ์ ๋ฐ์ผ๋ฉด Mytable
์ด ์ญ์ ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ค.
์์ ํ์ง ์์ ์ฝ๋
try
{
Properties props = new Properties();
String fileName = "contacts.txt";
FileInputStream in = new FileInputStream(fileName);
if( in != null ) { props.load(in); }
in.close();
// ์ธ๋ถ๋ก๋ถํฐ ์
๋ ฅ ๋ฐ๊ธฐ
String name = props.getProperty("name");
if( name != null )
{
query += " where name = '" + name + "'";
}
}
catch (IOException e) { โฆโฆ }
// ์ธ๋ถ ์
๋ ฅ๊ฐ์ด JDO ๊ฐ์ฒด์ ์ธ์๋ก ๊ทธ๋๋ก ์ฌ์ฉ๋๋ค.
return (List<Contact>) pm.newQuery(query).execute()
์์ ์ฝ๋์์๋ ์ธ๋ถ์์ ์ ๋ ฅํ ๊ฐ์ JDO ๊ฐ์ฒด์ ์ธ์๋ก ๊ทธ๋๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ฟผ๋ฆฌ๋ฌธ์ด ์์ ๋ ์ ์์ด ์์ ํ์ง ์๋ค.
์ธ๋ถ ์
๋ ฅ๋ถ๋ถ์ ?
๋ก ์ค์ ํ๊ณ , ์คํ ์ ํด๋น ์ธ์๊ฐ์ด ์ ๋ฌ๋๋๋ก ์์ ํ๋ฉด ์ธ๋ถ์ ์
๋ ฅ๊ฐ์ด ์ฟผ๋ฆฌ๋ฌธ์ ์์ ํ๋ ๊ฒ์ ๋ฐฉ์ง ํ ์ ์๋ค.
์์ ํ ์ฝ๋
try
{
Properties props = new Properties();
String fileName = "contacts.txt";
FileInputStream in = new FileInputStream(fileName);
props.load(in);
// ์ธ๋ถ๋ก๋ถํฐ ์
๋ ฅ๊ฐ ๋ฐ๊ธฐ
name = props.getProperty("name");
// ์
๋ ฅ๊ฐ์ ์ ๊ฒํ๋ค
if (name == null || "".equals(name)) return null;
query += " where name = ?";
}
catch (IOException e) { โฆโฆ }
javax.jdo.Query q = pm.newQuery(query);
// Query API์ ์ธ์๋ก ์ฌ์ฉ
return (List<Contact>) q.execute(name);
item์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ด์ฌ ๋, itemname์ ์
๋ ฅ ๊ฐ์ name' OR 'a' = 'a'
๋ก ์ฃผ๊ฒ๋๋ฉด SELECT * FROM items
๋ฅผ ์ํํ ๊ฒฐ๊ณผ์ ๋์ผํ๊ฒ ๋๋ค.
์ฆ, ๋ค์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
SELECT * FROM items WHERE itemname='name' OR 'a' = 'a';
๋ฐ๋ผ์ ์๋ ์๋์๋ ๋ค๋ฅด๊ฒ ๋ชจ๋ ์ฌ์ฉ์์ ๋ชจ๋ item์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๊ฒ ๋๋ค.
์์ ํ์ง ์์ ์ฝ๋
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String command = request.getParameter(COMMAND_PARAM);
...
if (command.equals(GET_USER_INFO_CMD))
{
String userId = request.getParameter(USER_ID_PARM);
String itemName = request.getParameter(ITEM_NAME_PARM);
PersistenceManager manager = factory.getPersistenceManager();
//query๋ฌธ์ ์
๋ ฅ๊ฐ ๋ฐ๋ก ์ฌ์ฉ
String sql = "SELECT * FROM items WHERE owner = '" + userName + "' AND itemname = '"
+ itemName + "'";
Query query = pm.newQuery(Query.SQL, sql);
query.setClass(Person.class);
List people = (List)query.execute();
...
}
}
์์ ์ฝ๋์ฒ๋ผ ์ธ๋ถ์ ์ ๋ ฅ๊ฐ ๋ฌธ์์ด์ ๋ฐ๋ก ์ฌ์ฉํ์ง ์๊ณ , ์คํ ์ ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌํจ์ผ๋ก์จ ์ง์๋ฌธ ์๋๋ฅผ ๋ฐ๊พธ์ง ๋ชปํ๊ฒ ํ ์ ์๋ค.
์์ ํ ์ฝ๋ ์์
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String command = request.getParameter(COMMAND_PARAM);
...
if (command.equals(GET_USER_INFO_CMD))
{
String userId = request.getParameter(USER_ID_PARM);
String itemName = request.getParameter(ITEM_NAME_PARM);
PersistenceManager manager = factory.getPersistenceManager();
String sql = "SELECT * FROM items WHERE owner = ? AND itemname = ?";
Query query = pm.newQuery(Query.SQL, sql);
query.setClass(Person.class);
List people = (List)query.execute(userId, itemName);
...
}
}