0

Python でスクリプトを書き始めたところ、奇妙な問題に遭遇しました。

mysql データベースにいくつかの値を挿入しようとしています。データベース フィールドは varchar、utf-8 unicode です

Python 3.2 と wamp サーバー 2.2 (apache 2.2.21、mysql 5.5.20) を使用する

print(ime)、print(prezime) などを試してみると、別のページからフォームの値が出力されるため、正しい値が得られます。

SQLステートメントを次のように書くと:

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

それらの値をデータベースに挿入します

私が書く場合:

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

それは動作しません

最後に私が入れたら

sql = "Clanovi(CL_Ime,CL_Prezime, CL_Email, CL_Tel) に挿入 (%s,%s,%s,%s)"%(ime,prezime,email,tel)

数字のみをフォーム フィールドに入力すると、データベースにコミットされます (新しいデータを追加します)。電子メール = aa tel = ダダ

(この方法にはセキュリティリスクがあることを知っています)

ここにコード全体があります(クエリが最後にどのように見えるかを確認するためだけに print(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()

お時間をいただき、ありがとうございました。

4

1 に答える 1

0

安全ではないため、Python の文字列操作を使用してクエリを組み立てるべきではありません。プログラムが SQL インジェクション攻撃に対して脆弱になります。代わりに、DB-API のパラメーター置換を使用してください。値を使用する場所にプレースホルダーとして配置し、カーソルのメソッド?の 2 番目の引数として値のタプルを指定します。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 (?,?,?,?)"

于 2012-04-06T05:41:58.957 に答える