2008

2016-06-27 4 views
0

나는이 내 저장 프로 시저의 다음과 같은 수정 : 나는 이전과 이후 '' '준 경우이 절차가 성공적으로 실행2008

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200) = 'MyTable', 
    @Parent int = 1145, 
    @Name nvarchar(100) = '''Test''', 
    @KPI nvarchar(max) = '''Test''', 
    @IDCount int = 1137 
AS 
BEGIN 
    EXEC('UPDATE ' + @TableName + ' SET Parent = ' + @Parent + ', Name = ' + @Name + ' , KPI = ' + @KPI + ' WHERE IDCount = ' + @IDCount) 
END 

문자열 값. '문자열 값 앞뒤에'을 놓아두면 오류가 발생합니다.

이유와 해결책을 찾도록 도와주십시오. 감사합니다

+0

쿼리가 동적이며 문자열을 연결하기 때문에. Sql은 '' '안에 동봉 할 때 문자열이라고 식별합니다. – Mani

답변

1

이 절차는 SQL injection 공격의 문을 엽니 다. 동적 인 SQL을 생성하는 데 정말로 필요한 이유가 없다면, 나는 그것을 피하는 것이 좋습니다.

동적 SQL 사용을 피할 수 없다면 최소한 quotename을 사용하여 절차를 좀 더 안전하게 유지하십시오. 쿼리를 실행하기 전에

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200) = 'MyTable', 
    @Parent int = 1145, 
    @Name nvarchar(100) = 'Test', 
    @KPI nvarchar(max) = 'Test', 
    @IDCount int = 1137 
AS 
BEGIN 

    EXEC('UPDATE QUOTENAME(' + @TableName + ') 
      SET Parent = ' + @Parent + ', 
       Name = ''' + @Name + ''' , 
       KPI = ''' + @KPI + ''' 
      WHERE IDCount = ' + @IDCount) 
END 
+0

Zohar, – user3717655

0
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200) = 'MyTable', 
    @Parent int = 1145, 
    @Name nvarchar(100) = '''Test''', 
    @KPI nvarchar(max) = '''Test''', 
    @IDCount int = 1137 
AS 
BEGIN 

  declare @sql nvarchar(4000) 
  set @sql='UPDATE ' + @TableName + ' SET Parent = ' + @Parent + ', Name = ' + @Name + ' , KPI = ' + @KPI + ' WHERE IDCount = ' + @IDCount 
  print @sql --find reason in the sql statement 
    EXEC(@sql) 
END 
0

내가 nvarcharsp_executesql 및 CAST int를 사용하는 것이 좋습니다과 @tablename을 QUOTENAME : -

당신이 당신의 질문에 상태 문제에 관해서는 단지 쿼리 본체에 ''' 이동 .

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spTMSA_Test_Run] 
    @TableName nvarchar(200), 
    @Parent int, 
    @Name nvarchar(100), 
    @KPI nvarchar(max), 
    @IDCount int 
AS 
BEGIN 

    DECLARE @sql nvarchar(max) 

    SELECT @sql = ' 
     UPDATE ' + QUOTENAME(@TableName) + ' 
     SET Parent = ' + CAST(@Parent as nvarchar(10))+ ', 
      Name = ''' + @Name + ''', 
      KPI = ''' + @KPI + ''' 
     WHERE IDCount = ' + CAST(@IDCount as nvarchar(10)) + ';' 


    EXEC sp_executesql @sql 

END