2011-08-26 7 views
2
내가 playframework.I을 사용하여 개발 된 웹 응용 프로그램에서보기에 어떤 SQL 문을 사용하고 있었다

내 SQL 쿼리 경향이있다은 SQL 주입 또는 다른 공격

public static void search(String word){ 
    String trimword = word.trim(); 
    String pattern = "%"+trimword+"%"; 
    String query="select distinct item from Item item where item.name like :pattern"; 
    List<Item> items = Item.find(query).bind("pattern", pattern).fetch(); 
    ... 
} 

'단어'는 문자열 다음과 같은 자바의 기능을 가지고 웹 페이지 양식의 텍스트 입력 필드를 통해 사용자가 입력 한 위의 내가 악의적 인 사람에 의해 악의적 인 일을 내 DB에 악용 될 수 있습니까? 내가 예를 들어 'SomeItem or '1'='1' 등 사용자 입력의 다양한 조합을 시도했지만 예기치 않은 일이 ..하지만 내 SQL에 대한 지식은 최소입니다. 누군가가이 취약점을 지적하고 개선/안전 장치를 제안하면 도움이 될 것입니다.

답변

2

.bind("pattern", pattern)은 SQL 주입 공격을 차단합니다. 따라서 쿼리가 SQL 주입 공격에 취약하지 않습니다.

또한 % 값을 추가하는 코드는 %을 입력하는 사용자와 비슷합니다. bind() 메서드는 같은 방법으로 처리합니다.

2

쿼리에 SQL 삽입이 발생하지 않습니다. 일반적으로 바인드 변수를 사용할 수없는 테이블 이름과 열 이름을 제외한 모든 것에 바인드 변수를 사용합니다. vunerable

select distinct item from item where name like '&pattern' 

불가능 그래서

,

select distinct item from :item where name like = 'buggy' 

좋아

select distinct item from item where name like :pattern 

@JNK, 당신은 내가 오라클 코딩 한 가정해야합니다 EDIT execute()가 정확하게 약 80 줄로 실행됩니다.

>>> import oracle 
>>> db = oracle.OracleConnection('schema/[email protected]') 
>>> db.connect() 
>>> SQL = """ select 1 from feed_logs where file_id = :file_id""" 
>>> bind_vars = { 'file_id' : '1; delete from feed_logs'} 
>>> db.DBCursor.execute(SQL, bind_vars=bind_vars) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
cx_Oracle.NotSupportedError: Variable_TypeByValue(): unhandled data type dict 
>>> 
+0

사용자가 '1; 사용자 삭제 '-'? – JNK

+0

@JNK 세 번째 질의에서,'Item.find (query) .bind ("pattern", pattern) .fetch();'를 호출해야합니다. 'bind()'메쏘드는 escaping과 SQL injection을 방지합니다. – Ryan

관련 문제