反注入字符串代码mysql c#

Posted

技术标签:

【中文标题】反注入字符串代码mysql c#【英文标题】:anti injection string code mysql c# 【发布时间】:2018-09-20 22:13:46 【问题描述】:

我为 mysql 编写了一些代码,起初我将其全部参数化。 后来有人告诉我,它不再安全了。 它是我尝试修复的旧程序,但标准输入查询对注入不安全。尽管代码中发生了很多“其他”mysql 事情,但没有多少区域可以生成新数据或打开用户查询。 所以然后我想(不要以什么是最好的注入证明方法而告终),让我们重新格式化输入字符串,这样我们就永远不会遇到这种情况。我写了一个正则表达式来始终正确格式化 varchar 输入字段

我现在正在使用它:

public string AllowedAsci(string input, string symbol="*")

   return Regex.Replace(input, @"[^a-zA-Z0-9-+_@., ]", symbol);

这基本上是基本电子邮件和数字的严格正则表达式,我的问题是这个正则表达式可以扩展到其他安全使用符号的宽度。

重要更新

这个问题的重点从来都不是讨论使用 mysql 参数,我从一开始就知道,虽然政治在起作用,但这里是我不允许接触的代码分支。目前,我无意在工作中(再次)陷入争论,也无意触碰该代码,我最终可能会责怪他们,但这是政治问题。

所以请继续关注什么是删除转义码的好正则表达式,但另一方面允许不允许注入的字符串。

正则表达式规则确实可以防止我知道的所有注入 除非你能用更好的正则表达式证明我的宽度错误。

【问题讨论】:

“后来有人告诉我它不再安全了。”有人错了,或者这是不完整的信息 您和告诉您参数化查询“不再安全”的人之间是否存在某种误解?您能否提供一个旧代码示例? 我投票结束这个问题,因为它是基于“参数化代码不安全”的错误前提。 另外,如果此代码应该允许电子邮件地址,则您需要包含更多字符,这会使您的 Injection Proofing 变得毫无用处。 @user3800527 “我不想再次陷入冲突,应该有一些更好的正则表达式” 不,这不是正确的方法。您冒着安全风险来避免冲突,当出现问题时,您将承担责任。 【参考方案1】:

我想我们可以回答你的函数是否安全并不重要,因为你同事的前提从一开始就不安全。

一个问题是,即使您只允许“安全”字符,也有一些方法可以使用安全字符对恶意输入进行编码,但它会做一些不安全的事情。

我在这个旧答案中发现了这个恶意输入示例:https://***.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

如果您工作的人会反对您而不是感谢您发现安全漏洞,您应该私下与您的共同经理交谈并要求被调到另一个部门。如果做不到,请开始寻找其他工作。

与此同时,按照他们告诉您的去做,但坚持进行代码审查。让他们批准,然后给您的经理写一封电子邮件,证明您的代码即使存在安全漏洞也已获得批准。

【讨论】:

这是我不包括 % 和 ; 的原因。也不包括 & 和 ( ) ;你对另一份工作的权利,但是在这里找到一个有点复杂,我可以在其他地方(大城市)找到一份工作,但我的个人生活将我束缚在 20 公里无交通堵塞的范围内(我的 GF 经常不支持这里是我的第一个目标)。 您可能只需要放下自尊,按照他们希望的方式编写此功能,然后忘记它。但是保留一些证据证明这是他们的决定,用于法庭案件。 :-)

以上是关于反注入字符串代码mysql c#的主要内容,如果未能解决你的问题,请参考以下文章

php防止sql注入

借安恒月赛web pop对象注入+反序列化字符逃逸深究其逃逸原理

借安恒月赛web pop对象注入+反序列化字符逃逸深究其逃逸原理

c# JavaScriptSerializer 序列化字符串具有反斜杠,导致 javascript 出现问题

mysql相关问题

Json 反序列化 C#