2011-12-29 3 views
0
cursor.execute("SELECT word_id from words where word_name = '%s'" % 
        (word)) 
    if cursor.fetchone() == None: 
     return False 
    return True 

나는이 문제를 방지 수있는 %s 형식 매개 변수의 가까이에 명시 적 '를 포함 생각했지만,액세스 장고의 SQL 정수기 오프라인

"'best'; DELETE * FROM words;" 

는 검색 할 정말 불쾌한 문자열이 될 것입니다! Django은 변조 방지 SQL 클렌저를 통해 매개 변수 기반 쿼리를 처리 할 것을 제안합니다.하지만 오프라인 응용 프로그램에이 매개 변수를 사용하면 어떻게 이러한 메서드에 액세스 할 수 있습니까? 아무도 이런 식으로합니까?

답변

4

장고 응용 프로그램에서이 작업을 수행하지 않는 경우 SQL 주입 공격으로부터 사용자를 보호하기 위해 django의 API에 의존 할 필요가 없습니다. 당신이 작업하고있는 db API는 SQL 쿼리에 매개 변수를 안전하게 입력하기위한 자체 메서드를 제공합니다.

# Never do this -- insecure! 
symbol = 'IBM' 
c.execute("... where symbol = '%s'" % symbol) 

# Do this instead 
t = (symbol,) 
c.execute('select * from stocks where symbol=?', t) 
+0

같은 원칙 장고의 임시 cursor.execute 기능 사용에 적용 다음 'PARAMS'를 사용하여 당신이 SQLite는을 사용하는 경우 예를 들어, 당신은 안전하게 매개 변수화 된 SQL 문을 구성하는 방법에 대한 http://docs.python.org/library/sqlite3.html에서 설명서를 참조 할 수 있습니다 cursor.execute가 실행 한 쿼리에 매개 변수를 제공하기 위해 % 연산자가 아닌 함수 인수는 SQL 주입 공격으로부터 호출을 보호합니다. – philofinfinitejest

+0

어디서 보았습니까? 아, 그래 ... [작은 바비 테이블] (http://bobby-tables.com/python.html). 에 대한 현장이 보인다. 감사! – Droogans

+0

하! 링크를 가져 주셔서 감사합니다. – philofinfinitejest

1

raw() 관리자를 사용하여 쿼리를 수행 할 수 없습니까? 이것은 여전히 ​​Django의 SQL 살균 기능을 사용하지만 모델에 대해 원시 SQL 쿼리를 실행할 수있게합니다. 내가 모델을 믿고있어이 경우

은 너무

Word.objects.raw("SELECT word_id from words where word_name = %s", [word]) 

이 잘 작동한다, '말씀'이다. 단어를 매개 변수로 사용하고 직접 문자열은 아니므로 이는 사용자를 보호합니다. raw()에 대한 설명서가 있습니다. here

관련 문제