2012-11-28 5 views
9

제목에서 알 수 있듯이이 코드가 SQL 삽입에 취약한 지 알고 싶습니다. 그렇다면 더 좋고 안전한 방법으로 같은 것을 성취 할 수 있습니까?이 Python 코드는 SQL 삽입에 취약합니까? (SQLite3)

def add(table,*args): 
    statement="INSERT INTO %s VALUES %s" % (table,args) 
    cursor.execute(statement) 
+1

나는 당신이 무엇 SQL 주입에 읽어 좋습니다. 그것은 매우 분명해야합니다. –

답변

21

예, 그렇습니다. 이를 방지하기 위해 다음과 같이 사용하십시오.

cursor.execute("INSERT INTO table VALUES ?", args) 

이와 같이 표를 입력 할 수 없습니다. 이상적으로 테이블은 하드 코딩 된 것이어야하며, 어떠한 상황에서도 사용자 입력에 의한 것이어야합니다. 테이블에 대해 수행 한 것과 비슷한 문자열을 사용할 수 있지만 사용자가 어떻게 든 변경할 수 없도록 100 % 확신하는 것이 좋습니다 ... 자세한 내용은 Can I use parameters for the table name in sqlite3?을 참조하십시오.

기본적으로 커서 명령에 매개 변수를 넣어야합니다. 매개 변수를 지정하면 데이터 데이터베이스를 안전하게 만들 수 있기 때문입니다. 첫 번째 명령을 사용하면 안전하지 않은 SQL 코드에 무언가를 넣는 특수한 table 또는 args을 만드는 것이 상대적으로 쉽습니다. python pages 및 참조 된 http://xkcd.com/327/을 참조하십시오. 특히, 파이썬 페이지 인용 :

기본적으로

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see http://xkcd.com/327/ for humorous example of what can go wrong).

Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.)

, 누군가가 이런 일을 다른 명령을 실행되는 인수를 설정할 수 있습니다 :

args="name; DELETE table" 

있도록 주어진 값을 될 물건 cursor.execute를 사용하여 인수는 나열된 것과 같을 수 있으며 쿼리를 수행하면 정확히 무엇을 얻을 수 있습니다. XKCD도 유머러스하게 설명합니다.

enter image description here

+0

감사. 취약한 이유에 대해 조금 확장 할 수 있습니까? – Sheldon

+1

조용한 것은 당연하지만 안전 할 수 있습니다. INSERT뿐만 아니라 모든 명령문에이 작업을 수행하십시오. SELECT 문도 마찬가지로 취약합니다. –

+0

@PearsonArtPhoto "TypeError : 함수는 최대 2 개의 인수 (3이 주어진다)를 얻습니다." – Sheldon

관련 문제