以下は安全ではないと言われました。
cursor.execute("""SELECT currency FROM exchange_rates WHERE date='%s'"""%(self.date))
なぜ'%s'
悪いのですか?ここで実際にSQLインジェクションを行うにはどうすればよいでしょうか?
self.date
である場合を想像してください"'; DROP TABLE exchange_rates --"
。次に、次を実行します。
SELECT currency FROM exchange_rates WHERE date=''; DROP TABLE exchange_rates -- '
そしてブーム、あなたはうんざりしています。をエスケープする必要がある'
ため、 の値はself.date
文字列に完全に含まれ、クエリとしては実行されません。
問題は、クエリとは別に値を渡す必要があるときに、文字列の書式設定を使用していることです。
たとえば、次のように比較します。
cursor.execute("SELECT currency FROM exchange_rates WHERE date=?", self.date)
文字列の書式設定方法を使用すると、誰かが;
値に a を挿入し (編集: 具体的には、引用符を a で閉じて'
からセミコロンを追加します)、その後に追加のクエリを挿入しようとすると、そのように実行されます。値を個別に渡すことにより、データがデータとしてのみ扱われ、クエリとして実行されないようにします。
この場合の追加の利点は、self.date が Python の date または datetime オブジェクトである場合、送信時にデータベースに適した方法で自動的にフォーマットされることです。self.date をクエリ文字列に直接追加しようとする場合は、日付形式を使用して、データベースが期待するとおりに正確に出力されるようにする必要があります。