【问题标题】:Finding a specific single quote and replacing with double quotes in C#在 C# 中查找特定的单引号并用双引号替换
【发布时间】:2016-04-05 19:52:09
【问题描述】:

我有一个问题,我想用 SQL 字符串中的双引号替换一些特定的单引号,但不是该字符串中的所有单引号。

EXEC procedureName 'param'eter1', 'parameter2'

在上面的示例中,我只想替换 'param'eter1' 中的单引号,但参数开头和结尾的单引号保持不变。

使用下面的命令替换字符串中的所有单引号,它看起来像这个''param''eter1'',这是不正确的。

sometext.Replace("'", "''")

我希望它看起来像这样:

EXEC procedureName 'param''eter1', 'parameter2'

另外请注意,我已经知道使用 SqlParameter 是处理 SQL 参数中的单引号的更好解决方案,但由于项目环境的限制,我无法实现。

更新:

在使用它们构建完整语句之前更改各个参数不是我的选择,因为我无权访问该代码。我的项目就像一个数据层,它从其他应用程序接收 SQL 字符串进行处理。

【问题讨论】:

  • 您可以使用匹配' 的正则表达式,而不是在空格之后和空格/逗号之前。但是你真正需要的是改变你的项目的架构(或者至少命名服务的名称,这样这里的人就不会成为 SqlInjection 的受害者......)
  • 在使用单个参数构造完整语句之前先对它们进行更改。

标签: c# sql .net


【解决方案1】:

这是一个非常糟糕的主意。 SQL 语法要求您准确地转义文字中的单引号,因为否则它无法判断单引号是用来表示单引号还是用来终止字符串文字。

考虑以下示例:

EXEC procedureName 'param ', ' eter1', 'parameter2'

你怎么知道这是否意味着有三个参数用于过程调用或只有两个?而且即使你知道这个特定的过程有两个参数,你也无法确定中间部分是属于第一个参数还是第二个参数。

如果系统在构造完整语句之前从用户输入构造 sql 语句而不处理单引号,则可以很容易地通过sql injection 攻击系统。

【讨论】:

  • 是的,你是对的,我试图实现的目标并不总是有效,而且它很容易受到 sql 注入攻击,所以我可能会放弃这个想法。
【解决方案2】:

你可以这样做

var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2); // just find a position of single quotes 
aStringBuilder.Insert(3, "/""); // replace that position with " quotes using loop
theString = aStringBuilder.ToString();

【讨论】:

  • 这对我不起作用,因为单引号的位置未知,它可以在任何地方。
猜你喜欢
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多