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

如何保护此功能免于SQL注入?

白昊东
2023-03-14
问题内容

public static bool TruncateTable(string dbAlias, string tableName)
{
string sqlStatement = string.Format(“TRUNCATE TABLE {0}”, tableName);
return ExecuteNonQuery(dbAlias, sqlStatement) > 0;
}


问题答案:

对抗SQL注入的最常见建议是使用SQL查询参数(此线程上的许多人都建议使用此参数)。

在这种情况下,这是错误的答案。 您不能在DDL语句中为表名使用SQL查询参数。

SQL查询参数只能代替SQL表达式中的文字值使用。这在SQL的每个实现中都是标准的。

对于具有表名的情况,我建议防止SQL注入是针对已知表名的列表验证输入字符串

您可以从中获取有效表名的列​​表INFORMATION_SCHEMA

SELECT table_name 
FROM INFORMATION_SCHEMA.Tables 
WHERE table_type = 'BASE TABLE'
  AND table_name = @tableName

现在,您可以将输入变量作为SQL参数传递给此查询。如果查询不返回任何行,则说明输入无效,不能用作表。如果查询返回一行,则表示该行已匹配,因此您可以确保可以安全使用它。

您还可以根据您定义的可以将应用程序截断的特定表的列表来验证表名,如@John
Buchanan所建议的那样

即使在验证了tableNameRDBMS中作为表名存在的表名之后,我也建议对表名进行定界,以防万一您使用带空格或特殊字符的表名。在Microsoft
SQL Server中,默认标识符定界符为方括号:

string sqlStatement = string.Format("TRUNCATE TABLE [{0}]", tableName);

现在,只有tableName与实际表匹配时才有SQL注入的风险,并且实际上在表名中使用方括号!



 类似资料:
  • 问题内容: 我想我会从您认为可以基本上消除SQL注入可能性的选项中获得您的意见(我认为)。 当前,我有我的管理员帐户,该帐户显然可以为我提供数据库的完整命令(更改,删除等)。我将拥有一个PHP使用的帐户,该帐户只能访问SELECT,UPDATE,DELETE,INSERT。如何为每个操作设置一个用户,然后仅在mysql_query语句中引用连接ID呢- 现在很明显,这将给服务器带来更多压力,本质上

  • 问题内容: 我正在使用Java开发应用程序,但是我不会发布代码。问题是,我测试了其中的一个jar反编译器,它几乎可以完美地从我的jar文件中获取代码!我的问题是如何在不提取代码的情况下分发jar文件? 问题答案: 由于Java在编译过程中保留了大多数“元数据”(允许动态加载和反射),因此直接编译(不仅反汇编)已编译的类文件是一种直接的方法。这就是为什么恢复的代码与原始代码非常相似的原因。 虽然不是

  • 问题内容: 众所周知,有很多Java反编译器工具可以将.cl​​ass转换为.java文件。 因此,我们需要保护.java文件免于反编译。我知道这是一个大话题,也许没有止境。 通常,有两种方法:混淆器和定制的类加载器。 是否有将这两种方式结合在一起的成熟解决方案或开源框架? 另一个方面与exe4j有关,它将jars打包到exe文件中,似乎可以保护java代码,因为我们看到的是exe文件而不是jar

  • 我按照本教程创建了一个可公开访问的HTTP云函数。我想用一个简单的API密钥来保护这一点——这可能吗? 关于安全的文档似乎没有涵盖如何限制行为,尽管提到你可以。。。

  • 问题内容: 我是Java初学者。我正在开发可解密某些数据的应用程序。解密密钥被硬编码到软件中,因此可以通过分析字节码看到。 我知道不能完全防止逆向工程,所以我想做的就是使过程尽可能地艰巨。 我的想法不是直接将密钥放入代码中,而是将其进行某种转换。例如,我可以写- 这样,查看字节码的人无法立即读取它。但是将必须遵循逻辑并对其进行转换,这在字节级别上不会那么容易。 那么你们怎么看?这有用吗?除了十六进

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