asp.net-web-api2 - 如何使用条件集合构建 SELECT * WHERE
问题描述
我想使用来自 REST api 的查询字符串的条件列表构建一个 SELECT 语句。我写了这个函数,但它可能容易受到 SQL 注入的攻击。有人可以告诉我这是否易受攻击如何解决?也许我应该使用某种 SQLBuilder 包?或者有没有办法只用 dotNet 来做到这一点。我正在使用 dotNet 4.6.1
string BuildSelect(NameValueCollection query)
{
var result = "SELECT * FROM MYTABLE";
if (query.Count == 0) return result;
var logic = " WHERE ";
foreach (string key in query)
foreach (string v in query.GetValues(key))
{
result += logic + key + " = " + v;
logic = " AND ";
}
return result;
}
解决方案
是的,它容易受到 SQL 注入攻击。您可以构建查询以改用参数(您只是使用 = 仅检查)。
由于您知道表名,这意味着您也知道列(键)可以是什么。因此,您可以循环您的列,如果集合具有该键,然后将其作为参数化语句添加到 where 但值部分未作为字符串传递,您将其解析为应为的类型(或让后端执行转换并在无法转换时出错)。在伪代码中:
List<string> clauses = new List<string>();
var result = "SELECT * FROM MYTABLE";
foreach( var col in myTable.Columns )
{
if (query.ContainsKey(col.Name))
{
clauses.Add( $"{col.Name} = @{col.Name}";
string v = query[col.Name];
command.Parameters.Add( $"@{col.Name}", col.Type).Value = typeParse(v);
}
}
if (clauses.Any())
{
result += " WHERE " + string.Join( " AND ", clauses );
}
return result;
高温高压
推荐阅读
- c# - C# Regex.Split,如何将字符串拆分为用括号括起来而不是用括号括起来?
- python - Djongo ArrayReferenceField .add() 奇怪的行为
- javascript - GTM - 将 DataLayer 变量截断为自定义 Javascript 变量
- r - 尽管我遵循了此代码的模板,但我仍然收到此错误。有经验的人能发现我看不到的东西吗?我是 R 新手
- telegram - 电报机器人,报价=假问题
- react-native - 隐藏的标签栏在 React Native 应用程序中突出
- ssh - 使用 Plink 在另一台服务器 (jumphost) 后面的远程服务器上执行命令
- python - matplotlib 根据任意函数缩放轴
- javascript - 如何将 div 附加到呈现列表中的输入值?
- node.js - 在 Loopback 应用程序中发出请求时使用不同的错误消息