제목에서 알 수 있듯이이 코드가 SQL 삽입에 취약한 지 알고 싶습니다. 그렇다면 더 좋고 안전한 방법으로 같은 것을 성취 할 수 있습니까?이 Python 코드는 SQL 삽입에 취약합니까? (SQLite3)
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
제목에서 알 수 있듯이이 코드가 SQL 삽입에 취약한 지 알고 싶습니다. 그렇다면 더 좋고 안전한 방법으로 같은 것을 성취 할 수 있습니까?이 Python 코드는 SQL 삽입에 취약합니까? (SQLite3)
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
예, 그렇습니다. 이를 방지하기 위해 다음과 같이 사용하십시오.
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도 유머러스하게 설명합니다.
나는 당신이 무엇 SQL 주입에 읽어 좋습니다. 그것은 매우 분명해야합니다. –