2017-09-10 4 views
1

우선 Im과 데이터베이스에 꽤 새로운 어제 파이썬을 사용하기 시작했습니다.SQLite 입력을 살균 처리

나는 (내가 Perl로 DBI를 통해 이전이 일부 SQLite는 사용)에 sqlite3를 모듈로 주위를 연주하기 시작

나는 공식 파이썬 SQLite는 문서 here

# Never do this -- insecure! 
symbol = 'RHAT' 
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) 

# Do this instead 
t = ('RHAT',) 
c.execute('SELECT * FROM stocks WHERE symbol=?', t) 
print c.fetchone() 

에 다음의 예를 통해 발견

첫 번째 예제가 안전하지 않은 이유는 무엇입니까?

그냥 문서를 저장하는 응용 프로그램이 있고 사용자가 문서 이름으로 데이터베이스를 검색 할 수 있습니다. 이를 위해

는 S/i는 키워드 쿼리를 생성 한 후 사용자로부터 입력을 필요로 할 일을하는

내가 튜플 지금보다 다음 문자열을 내가 모두에서 의미하는 "안전한"되어야하는 이유 얻을 해달라고 사용자는 "xyz OR 1 = 1"과 같은 것을 입력하여 모든 레코드를 표시 할 수 있습니다.

누군가 나를 친절하게 설명해주기를 바랍니다. 나는 이것이 아마도 경험이있는 누군가에게 매우 분명하다는 것을 안다.

+1

터플이 처리되었으므로 비밀 소스가 있습니다. –

+1

"두 경우 모두 사용자가"xyz OR 1 = 1 "과 같이 모든 레코드를 표시 할 수 있습니다"- 아니, 그게 전부입니다. 좋아하는 검색 엔진에서 "SQL injection"을 검색하십시오. 이것은 매우 광범위하게 다루어집니다. – Mat

답변

1

매개 변수는 아니요 단순 문자열 대체와 동일합니다. 그들은 직접 해석이 더없이 데이터베이스에 그 값을 제공 : 값이 모든 특수 문자에 대해 올바르게 인용 한 것처럼

매개 변수와
>>> import sqlite3 
>>> db=sqlite3.connect(":memory:") 
>>> db.execute("CREATE TABLE t(x)")     
>>> db.execute("INSERT INTO t VALUES('x'),('secret')") 
>>> db.execute("SELECT * FROM t WHERE x = '%s'" % ("x' OR 1=1--",)).fetchall() 
[(u'x',), (u'secret',)] 
>>> db.execute("SELECT * FROM t WHERE x = ?",  ("x' OR 1=1--",)).fetchall() 
[] 

, 당신은 (이 경우, WHERE x = 'x'' OR 1=1--'에서) 동일한 효과를 얻을.

+0

마지막 문장은 정말 나에게 그것을 설명했다, 고마워! :) – Simerax