2017-11-07 20 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

자리 표시자를 사용하면 얻을 수있는 이점 중 하나는 수동으로 따옴표를 붙일 필요가 없으며 따옴표로 묶지 않아도된다는 것입니다. 그래서 당신은 당신의 쿼리에

""" ... 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

당신은 주인입니다. 완벽하게 작동했습니다. 고마워. –