当前位置: 首页 > 面试题库 >

如何使用sp_executesql避免SQL注入

富锦
2023-03-14
问题内容

在下面的示例代码中,表名称是一个输入参数。在这种情况下,如何避免使用进行SQL注入sp_executesql。下面是示例代码,我尝试使用sp_executesql它来避免它,但是它不起作用。谁能告诉我如何纠正它?

ALTER PROC Test @param1  NVARCHAR(50), 
                 @param2  INT, 
                 @tblname NVARCHAR(100) 
AS 
  BEGIN 
      DECLARE @sql NVARCHAR(1000)

      SET @sql= N'  select * from ' + @tblname 
                + ' where name= @param1 and id= @param2';

      PRINT @sql

      EXEC Sp_executesql 
        @sql, 
        N'@param1 nvarchar(50), @param2 int', 
        @param1, 
        @param2; 
  END

EXEC Test 
  'John', 
  2, 
  ' emp; delete from emp where id = 567; select * from emp '

输出:打印消息:

select * from  emp; delete from emp where id = 567; select * from emp  where name= @param1 and id= @param2;

所有输入参数将完全替换,并删除一行。请让我知道如何处理这种情况。


问题答案:

您可以将表名包含在 []

SET @sql= N'  select * from [' + @tblname + '] where name= @param1 and id= @param2';

但是,如果使用两部分命名约定,例如dbo.tablename,则必须添加其他解析,因为这[dbo.tablename]将导致:

无效的对象名称[dbo.tablename]。

您应该对其进行解析,以使其等于dbo.[tablename]



 类似资料:
  • 什么是SQL注入 SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。 而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的

  • 本文向大家介绍Java Web 如何避免 SQL 注入?相关面试题,主要包含被问及Java Web 如何避免 SQL 注入?时的应答技巧和注意事项,需要的朋友参考一下 使用预处理 PreparedStatement。 使用正则表达式过滤掉字符中的特殊字符。

  • 本文向大家介绍什么是sql注入?如何避免sql注入?相关面试题,主要包含被问及什么是sql注入?如何避免sql注入?时的应答技巧和注意事项,需要的朋友参考一下 用户根据系统的程序构造非法的参数从而导致程序执行不是程序员期望的恶意SQL语句。使用参数化的SQL就可以避免SQL注入。 详细参考复习ppt。举例子,摆事实! 1' or 1=1

  • 问题内容: 我知道PreparedStatements避免/防止SQL注入。它是如何做到的?使用PreparedStatements构造的最终表单查询是否为字符串? 问题答案: SQL注入的问题在于,用户输入被用作SQL语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容(而不是SQL命令的一部分)进行处理。 但是,如果您不使用用户输入作为已准备好的语句的参数,而是通过将字符串连

  • 问题内容: 我知道PreparedStatements可以避免/防止SQL注入。它是如何做到的?使用PreparedStatements构造的最终表单查询是否为字符串? 问题答案: SQL注入的问题在于,用户输入被用作SQL语句的一部分。通过使用准备好的语句,您可以强制将用户输入作为参数的内容(而不是SQL命令的一部分)进行处理。 但是,如果您不使用用户输入作为已准备好的语句的参数,而是通过将字符

  • 问题内容: 我使用一个简单的cms作为我网站的后端,在那里我可以更新新闻等。我想对SQL注入安全,所以我想知道这段代码是否被认为是安全的,或者是否可以做一些使其更安全的事情: 谢谢,祝你有美好的一天! 问题答案: 您没有在消毒 。 做一个就可以了,或(更好)拒绝共处理如果ID不是整数(假设ID是一个字段)。