2017-11-07 10 views
0

からSQLインジェクションを防ぎます。フラスコSQLAlchemyの+ pymssqlは、私は完全に正常に動作次のルートを持っているストアドプロシージャのparams

query = """ 
     DECLARE @return_value int, @EXIST bit 
     EXEC @return_value = [dbo].[SP_CHECK_ID] @ID = N':id', 
     @EXIST = @EXIST OUTPUT 
     SELECT @EXIST as N'@EXIST' 
     """ 
result = db.session.execute(query, {'id': id}, bind=db.get_engine(app, 'second_db')) 

をしかし、私はエラーを得た:それを修正するためには、私が試した

sqlalchemy.exc.ProgrammingError: (pymssql.ProgrammingError) (102, b"Incorrect syntax near '179'.DB-Lib error message 20018, severity 15:\nGeneral SQL Server error: Check messages from the SQL Server\n") [SQL: "DECLARE @return_value int, @EXIST bit EXEC @return_value = [dbo].[SP_CHECK_ID] @ID = N'%(id)s', @EXIST = @EXIST OUTPUT SELECT @EXIST as N'@EXIST'"] [parameters: {'id': '179'}] 

私は他の方法で試してみた:

query = """ 
     DECLARE @return_value int, @EXIST bit 
     EXEC @return_value = [dbo].[SP_CHECK_ID] @ID = N'%s', 
     @EXIST = @EXIST OUTPUT 
     SELECT @EXIST as N'@EXIST' 
     """ 
result = db.session.execute(query, id, bind=db.get_engine(app, 'second_db')) 

しかし、私は得ました:

AttributeError: 'list' object has no attribute 'keys' 

私も試しました

from sqlalchemy.sql import text 
query = text(...) 

を使用していますか? %sの代わりに同じエラーがあります。

答えて

0

プレースホルダを使用するメリットの1つは、手動で引用する必要はなく、必要ではないことです。だから、あなたはあなたのクエリで

""" ... N':id' ... """ 

が含まれている場合、それは

""" ... N''179'' ... """ 

かなど、あなたの引数の型に応じて、その他の修正はSQLAlchemyのを引用符を削除してみましょうし、その後で/ DB-としてレンダリングされることがありますAPIドライバーは、すべてのことを処理します。

query = """ 
     DECLARE @return_value int, @EXIST bit 
     EXEC @return_value = [dbo].[SP_CHECK_ID] @ID = :id, 
     @EXIST = @EXIST OUTPUT 
     SELECT @EXIST as N'@EXIST' 
     """ 
result = db.session.execute(
    query, {'id': id}, 
    bind=db.get_engine(app, 'second_db')) 

という名前のプレースホルダーのスタイルはtext()構築物により提供バックエンド中立SQLAlchemyの抽象化です。 Session.execute()は、テキストSQLを省略した場合、暗黙的にラップします。 %s,?などは、DP-API固有のプレースホルダスタイルです。 pymssqlは%スタイルを使用しているようです。

+0

あなたはマスターであり、完璧に機能しました。どうもありがとう。 –

関連する問題