反注入字符串代码mysql c#

x4shl7ld  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(655)

我为mysql写了一些代码,一开始我把它都参数化了。后来有人告诉我,这已经不安全了。这是一个旧的程序,我试图修复,但标准的输入查询,其中不安全的注射。尽管在代码中有很多“其他”mysql的事情发生,但是没有太多生成新数据或开放用户查询的区域。因此,我想(不是为了结束一场关于什么是最好的防注入方法的斗争),让我们重新格式化输入字符串,这样我们就永远不会在这种情况下得到它。我编写了一个regex,以便始终具有格式正确的varchar输入字段
我现在用这个:

public string AllowedAsci(string input, string symbol="*")
{
   return Regex.Replace(input, @"[^a-zA-Z0-9-+_@., ]", symbol);
}

这基本上是一个严格的正则表达式的基本电子邮件和数字,我的问题是这个正则表达式是否可以扩展到其他安全使用的符号。
重要更新
这个问题的重点从来不是要讨论使用mysql参数,我从一开始就知道,虽然政治在起作用,但这里有一些代码分支我是不允许接触的。目前,我无意(再次)卷入工作中的争吵,也无意触碰这一准则,我最终可能会责怪他们,但这是政治原因。
所以请继续讨论什么是一个好的正则表达式来删除转义码,但另一方面允许字符串不允许注入。
正则表达式规则确实可以防止我所知道的所有注入,除非你能证明我有一个更好的正则表达式。

zysjyyx4

zysjyyx41#

我想我们可以回答,你的功能是否安全并不重要,因为你同事的前提从一开始就不安全。
一个问题是,即使您只允许使用“安全”字符,也存在使用安全字符对恶意输入进行编码的方法,但它会做一些不安全的事情。
我在这个旧答案中发现了一个恶意输入的例子:https://stackoverflow.com/a/45099/20860:

DECLARE%20@S%20VARCHAR(4000);SET%20@S=CAST(0x4445434C415 245204054205641524348415228323535292C40432056415243

(我只展示了恶意负载的一部分。关键是,可以通过一组过滤后的字符来利用sql注入漏洞,您可以假定这些字符是安全的。)
我还要指出,如果你的表达是为了允许电子邮件地址,它不会。还有许多其他字符是电子邮件地址的合法部分,包括一些类似的字符 " 这将导致sql注入漏洞(即使没有我上面提到的编码技巧)。
请在此处查看电子邮件地址模式的测试数据列表:https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php
如果你为一个会和你打架而不是感谢你发现安全漏洞的人工作,你应该私下和你的共同经理谈谈,并要求调到另一个部门。如果做不到,那就换个工作吧。
同时,按照他们的要求去做,但要坚持代码复查。让他们批准它,并写一封电子邮件给你的经理,证明你的代码被批准,即使有安全缺陷。

相关问题