2017-11-29 9 views
0
class Database(object): 
    def __init__(self,ip_address,datetime_now): 
     self.db_connec = mysql.connector.connect(user = DATABASE_USER, password = DATABASE_PASS, host = DATABASE_HOST, database = DATABASE) 
     self.ip = ip_address 
     self.datetime_now = datetime_now 

def run_query(self, query): 
    if db_connec == None: 
     raise mysql.connector.DatabaseError 
     return None 

def log_threat(self): 
    lol = "ass" 
    self.cursor = self.db_connec.cursor() 
    self.cursor.execute("INSERT INTO unauthorized_clients (ip_address, time) VALUES ({}, {})".format(self.ip, lol)) 

#INSERT INTO unauthorized_clients (ip_address, time) VALUES ("trtr", "test") 

私はlog_threat関数を呼び出してこのエラーを取得しています。 mysqlターミナル(navicat)でクエリを実行するとうまく動作しますが、ここではこのエラーが発生します。PythonコードからのmySQLエラー

IPが取り除かれている理由をライン1

で「)、0.1お尻を」マニュアルは近くを使用する 権利構文についてはMySQLサーバのバージョンに対応するチェック?

私は印刷(self.ip)をログインしたとき、私は127.0.0.1おそらく

答えて

1

self.ipは文字列になり得ます。文字列値が引用されていないことを

>>> "INSERT INTO unauthorized_clients (ip_address, time) VALUES ({}, {})".format('127.0.0.1', 'ass') 
'INSERT INTO unauthorized_clients (ip_address, time) VALUES (127.0.0.1, ass)' 

予告:それは、クエリ文字列を構築するために使用された場合は結果のクエリは次のようになりますので、引用符は、挿入されません。

クエリを作成するときに文字列関数を使用しないでください。SQLインジェクションの脆弱性やここでのエラーの種類につながる可能性があります。代わりに、SQLインジェクションに対して保護するパラメータ化クエリを使用し、適切に文字列値を引用:

lol = 'ass' 
self.ip = '127.0.0.1' 

self.cursor.execute("INSERT INTO unauthorized_clients (ip_address, time) VALUES (%s, %s)", (self.ip, lol)) 

をここでvaulesが​​に2番目の引数として渡されたタプルに供給されるようになっています。

+0

は、私はパラメータ化クエリについて学ぶために今持っている:)ありがとう - は} {周りに引用符を追加します適切かつ推奨されるソリューション。 %sの2番目の解決策は私に奇妙な.decodeソケットエラーを与えました –

+0

@MichaelPresman:間違ったプレースホルダを推測した可能性があります。それは '%s'の代わりに'? 'にすることができます。あなたは 'mysql.connector.paramstyle'でチェックできるはずです。 – mhawke

+0

self.cursor.execute( "INSERT INTO unauthorized_clients(ip_address、time)VALUES(?、?)"、(self.ip、lol)) - >すべてのパラメータがSQL文で使用されているわけではありません。とにかくありがとう –

0

解決方法このコードは、これを修正しました。私が望むように、p:>「{}」 を同様にself.db_connec.commitを追加()

class Database(object): 
    def __init__(self,ip_address,datetime_now,): 
     self.db_connec = mysql.connector.connect(user = DATABASE_USER, password = DATABASE_PASS, host = DATABASE_HOST, database = DATABASE) 
     self.ip = ip_address 
     self.datetime_now = datetime_now 

    def run_query(self, query): 
     if self.db_connec == None: 
      raise mysql.connector.DatabaseError 
      return None 

    def log_threat(self): 
     self.cursor = self.db_connec.cursor() 
     print("Logging Threat... ") 
     self.cursor.execute("INSERT INTO unauthorized_clients (ip_address, time) VALUES ('{}', '{}')".format(self.ip, self.datetime_now)) 
     self.db_connec.commit() 


if __name__ == "__main__": 
    client_connect() 
+0

SQLインジェクションの脆弱性を緩和するために、パラメータ化されたクエリを実行することをお勧めします。 – mhawke

関連する問題