2012-04-06 2 views
0

파이썬에서 스크립팅을 시작했고 이상한 문제가 발생했습니다.파이썬 cgi 스크립트는 정수 만을 mysql 데이터베이스에 삽입합니다.

일부 값을 mysql 데이터베이스에 삽입하려고합니다. 데이터베이스 필드는 VARCHAR, UTF-8 유니 코드

파이썬 3.2을 사용하여

및 WAMP 서버 2.2 (아파치 2.2.21, MySQL은 5.5.20)이다

나는 등 인쇄 (IME), 인쇄 (prezime)를 시도하는 경우 다른 페이지의 양식 값을 인쇄하므로 정확한 값을 얻고 있습니다. 이 데이터베이스

에 해당 값을 삽입

"INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES ("aa","aa","aa","aa")" 

내가 작성하는 경우 :로

나는 SQL 문을 작성하는 경우

sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (%s,%s,%s,%s)",(ime,prezime,email,tel) 

는 내가 넣으면 마침내

작동 나던

SQL = % (IME, prezime, 이메일, 전화)

내가에만 넣어 경우 "Clanovi (CL_Ime, CL_Prezime, CL_Email, CL_Tel) 가치 (% s의 % s를 % s에 % s의) INTO INSERT" 데이터베이스에 커밋 할 양식 필드에 숫자를 입력하십시오. ime = 21 prezime = 232 이메일 = 123 tel = 123 글자를 쓴다면 새 행을 데이터베이스에 추가하지 마십시오. ime = smth prezime = blabla email = AA 전화 = (I 인쇄 (SQL) 내 쿼리가 마지막에 어떻게 생겼는지 볼을 퍼트) 다다

(나는이 방법은 보안 위험이 알고)

여기

는 전체 코드입니다

#!c:\python32\python.exe 
import MySQLdb 
import cgi 
print ("Content-type: text/html\n\n") 

form = cgi.FieldStorage() 
ime =form["ime"].value 
prezime = form["prezime"].value 
email= form["email"].value 
tel = form["tel"].value 
print(ime)  
db = MySQLdb.connect("localhost","root","","biblioteka") 

cursor = db.cursor() 

sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (%s,%s,%s,%s)"%(ime,prezime,email,tel) 
print(sql) 
try: 
    cursor.execute(sql) 
    db.commit() 
except: 
    db.rollback() 
db.close() 

시간을내어 도와 주셔서 감사합니다.

+1

http://en.wikipedia.org/wiki/SQL_injection 또한 – SingleNegationElimination

답변

0

그렇게하는 것이 안전하지 않기 때문에 파이썬의 문자열 연산을 사용하여 쿼리를 조합해서는 안됩니다. 프로그램을 SQL 인젝션 공격에 취약하게 만듭니다. 대신 DB-API의 매개 변수 대체를 사용하십시오. 당신이 값을 사용하여 원하는 목적지까지 자리 표시 자 ?을 넣고, 다음 커서의 execute() 방법에 대한 두 번째 인수로 값의 튜플을 제공

sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)" 
print(sql) 
try: 
    cursor.execute(sql, (ime, prezime, email, tel)) 
    db.commit() 
except: 
    db.rollback() 
db.close() 

업데이트 : 루크 (주석 참조) 맞다 : MySQL의 '대신'% s '을 (를) 사용합니까?

업데이트 된 SQL 문 : sql = "INSERT INTO Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) VALUES (?,?,?,?)"

+1

MySQLdb는 자리로'%의 s'를 사용 cursor.execute()의 '매개 변수'인수를 참조 , 아니라'? '. 위의 코드는 '문자열 형식을 변환하는 동안 변환 된 모든 인수가 아닙니다'오류를 제공합니다. –

관련 문제