14

Python3でMySQLデータベースへの入力をエスケープするにはどうすればよいですか?私はPyMySQLを使用していて正常に動作しますが、次のようなことをしようとすると次のようになります。

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  '{}'".format(request[1]))

'文字列にまたはが含まれている場合は機能しません"。私も試しました:

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  %s",request[1])

これに伴う問題は、ライブラリ(PyMySQL)がPython2.xのフォーマット構文を使用している%ことです。これは機能しなくなりました。私もこの可能な解決策を見つけました

conn.escape_string()

ここにありますが、このコードをどこに追加すればよいかわかりません。これが私が得たすべてです:

import pymysql
import sys
conn = pymysql.connect( host   = "localhost",
            user   = "test",
            passwd = "",
            db     = "test")
cursor = conn.cursor()
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  {}".format(request[1]))

result = cursor.fetchall()

cursor.close()
conn.close()

編集:私はそれを解決しました!PyMySQLでは、正しい方法は次のようになります。

import pymysql
import sys
conn = pymysql.connect(host="localhost",
            user="test",
            passwd="",
            db="test")
cursor = conn.cursor()
text = conn.escape(request[1])
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  {}".format(text))

cursor.close()
conn.close()

text = conn.escape(request[1])はコードをエスケープするものです。PyMySQLコード内で見つかりました。そこにrequest[1]、入力があります。

4

3 に答える 3

35

「解決済み」の回答は機能しますが、ベストプラクティスではありません。Python DBIに準拠したライブラリを使用する場合は、文字列をフォーマットして実行に渡すのではなく、バインド変数を使用する必要があります。その方法論には固有の危険があります。

したがって、これはそれを行う正しい方法です。

cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` = %s", text)

これはフォーマット文字列ではなく、実行カーソルに渡されるバインド変数であることに注意してください。

詳細:Python DBI PEP

于 2014-10-29T00:14:24.060 に答える
3

解決しました。PyMySQLでは、正しい方法は次のようになります。

import pymysql
import sys
conn = pymysql.connect(host="localhost",
            user="test",
            passwd="",
            db="test")
cursor = conn.cursor()
text = conn.escape(request[1])
cursor.execute("SELECT * FROM `Codes` WHERE `ShortCode` =  {}".format(text))

cursor.close()
conn.close()

text = conn.escape(request[1])はコードをエスケープするものです。PyMySQLコード内で見つかりました。そこにrequest[1]、入力があります。

于 2012-07-07T12:47:37.003 に答える
0

ヘルパー機能を使用する準備ができました

def mysql_insert(conn, table, row):
    cols = ', '.join('`{}`'.format(col) for col in row.keys())
    vals = ', '.join('%({})s'.format(col) for col in row.keys())
    sql = 'INSERT INTO `{0}` ({1}) VALUES ({2})'.format(table, cols, vals)
    conn.cursor().execute(sql, row)
    conn.commit()

使用例

insert_into(conn, 'people', {
    'firstname': 'John',
    'lastname': 'Doe',
    'age': 18, })

参照:https ://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L157-L158

def execute(self, query, args=None):

argsがリストまたはタプルの場合、%sをクエリのプレースホルダーとして使用できます。
argsがdictの場合、%(name)sをクエリのプレースホルダーとして使用できます。
于 2017-09-10T23:35:51.510 に答える