J2EE Persistence API๋ฅผ ์ฌ์ฉํ๋ ์์ฉํ๋ก๊ทธ๋จ์์ ์ธ๋ถ์ ์ ๋ ฅ์ ๊ฒ์ฆ ์์ด ์ง์๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ญ์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ํ์ง ์์๋ ์์์ query ๋ช ๋ น์ด๋ฅผ ์ํํ๋ ๊ณต๊ฒฉ์ ๋งํ๋ค.
โก๏ธ ์์ ํ ์ฝ๋ฉ ๋ฐฉ๋ฒ
- ์ธ๋ถ์ ์ ๋ ฅ์ด ์ง์๋ฌธ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ค. ์ฆ, ์ธ์ํ ๋ ์ง์๋ฌธ ์ฌ์ฉ
- ์ง์๋ฌธ ์์ฑ ์ ์์ ๋ฌธ์์ด๋ง์ ์ฌ์ฉํ๊ณ , javax.persistence.Query.setParameter() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์๊ฐ์ ์ค์ ํ๋ค.
์ ๋ ฅ๊ฐ์ id๋ผ๊ณ ํ ๋, ์ ๋ ฅํ ๊ฐ์ ๋ค์ ์์น์ ๋ค์ด๊ฐ๋ค.
SELECT col1 FROM MYTABLE WHERE name = '(์
๋ ฅ๊ฐ)'
๋ง์ฝ ๊ณต๊ฒฉ์๊ฐ ์
๋ ฅ๊ฐ์ผ๋ก foo'; DROP MYTABLE; โ
์ ์
๋ ฅํ๋ฉด ์ง์๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋๋ค.
SELECT col1 FROM MYTABLE WHERE name = 'foo'; DROP MYTABLE; --'
๋ฐ๋ผ์ ๊ฒ์ฆ ์์ด ์ง์๋ฌธ์ ๊ทธ๋๋ก ์ ๋ ฅํ๋ฉด, MYTABLE ์ ์ญ์ ํ๋ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ค.
์์ ํ์ง ์์ ์ฝ๋
Properties props = new Properties();
String fileName = "conditions.txt";
FileInputStream in = new FileInputStream(fileName);
props.load(in);
// ์ธ๋ถ๋ก๋ถํฐ ์
๋ ฅ ๋ฐ๊ธฐ
String id = props.getProperty("id");
// ์ธ๋ถ ์
๋ ฅ๊ฐ์ด ๊ทธ๋๋ก query์ ์ธ์๋ก ์ฌ์ฉ๋๋ค.
Query query =
em.createNativeQuery("SELECT OBJECT(i) FROM Item i WHERE i.itemID > " + id);
List<ItemListner> items = query.getResultList();
โฆโฆ
return r_type;
โ ๋ฐ๋ผ์ ์ธ์๋ฅผ ๋ฐ๋ ์ง์๋ฌธ์ ์์ฑ ํ, ์ธ์ ๊ฐ์ ์ค์ ํ์ฌ ์คํ๋๋๋ก ํ๋ค.
๊ทธ๋ ๊ฒ ํ๋ฉด ์ธ๋ถ ์ ๋ ฅ๊ฐ์ ๋ฐ๋ผ์ ์ง์๋ฌธ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
์์ ํ ์ฝ๋
Properties props = new Properties();
String fileName = "conditions.txt";
FileInputStream in = new FileInputStream(fileName);
props.load(in);
// ์ธ๋ถ ์
๋ ฅ๊ฐ ๋ฐ๊ธฐ
String id = props.getProperty("id");
// ์
๋ ฅ๊ฐ์ ๊ฒ์ฌํ๋ค
if (id == null || "".equals(id)) id = "itemid";
// Query์ ์์ฑํ๋ค
Query query =
em.createNativeQuery("SELECT OBJECT(i) FROM Item i WHERE i.itemID > :id");
query.setParameter("id", id);
List<ItemListner> items = query.getResultList();
โฆโฆ
return r_type;
- ์ ๋ ฅ๊ฐ์ userID์ passwd๋ฅผ SQL ์ง์๋ฌธ์ ๊ทธ๋๋ก ๋ฃ๋ ๊ฒฝ์ฐ
์์ ํ๊ฒ SQL ๊ตฌ๋ฌธ ์์ฑํ๊ธฐ ์ํด, ์ธ๋ถ๋ก๋ถํฐ ์
๋ ฅ๋๋ ๊ฐ์ ์ง์๋ฌธ์ ๋ฐ๋ก ์ฌ์ฉํ๊ธฐ ์ ์ ์์ ํ ํํ๋ก makeSecureString
ํจ์๋ฅผ ํตํด ๋ณ๊ฒฝํ๋ค.
์ด ํจ์๋ก๋ 3๊ฐ์ง ์ ํ ์กฐ๊ฑด์ ์ฌ์ฉํ์ฌ ์์ ํ ๋ฌธ์์ด์ ์์ฑ ๊ฐ๋ฅํ๋ค.
- ์ธ์์ SQL๋ฌธ์์ ์ฐ์ด๋ ์์ฝ์ด๋ฅผ ์ ํํ๋ค.
- ์ธ์์ ์ํ๋ฒณ๊ณผ ์ซ์๋ฅผ ์ ์ธํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํํ๋ค. ( ํนํ ' ์ฑ๊ธ๋ฐ์ดํ)
- ์์ ์กฐ๊ฑด์ ์ ํํ๊ธฐ ์ํด ์ ๊ท์์ ์ฌ์ฉํ๋ค.
โก๏ธ ๋ฌธ์์ด์ ๋ ์์ ํ๊ฒ ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ฌธ์์ด์ ๊ธธ์ด ์ ํ์ ๋ฎ์ถ๋ค.
- ์ ๊ท์์ ํฌํจ๋๋ ๋จ์ด์ ๊ฐ์๋ฅผ ๋์ธ๋ค. (๋ธ๋๋ฆฌ์คํธ ๊ฐ๋ ์ผ๋ก SQL procedure๋ช ์ด๋ SQL ๋ช ๋ น์ด๋ค์ ํํฐ๋งํ ์ ๊ท์์ ํฌํจ)
private String makeSecureString(final String str, int maxLength)
{
String secureStr = str.substring(0, maxLength);
Matcher matcher = unsecuredCharPattern.matcher(secureStr)
return matcher.replaceAll("");
}
๋ฐ๋ผ์ ํจ์๋ ์์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
String query = "SELECT * FROM members WHERE username= '" + makeSecureString(userId) + "' AND password = '" + makeSecureString(password) + "'";
Query query = manager.newQuery(queryStr);
๊ทธ ํ ์ ๋ ฅ๊ฐ์ ์์ ํจ์์ ์ธ์๋ก ์ ๋ฌ ํ ํ, ์์ฑ๋ ๋ฌธ์์ด์ SQL ๋ช ๋ น์ด์ ๋ฃ์ด ์คํํ๋ฉด ๋ณด๋ค ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.