我为mysql写了一些代码,起初我把它全部参数化了。 后来有人告诉我,它不再安全。 它是我尝试修复的旧程序,但标准输入查询不能安全注射。虽然代码中发生了很多“其他”mysql事件,但生成新数据或打开用户查询的区域并不多。 所以我想(不要在最好的注射方法的战斗中结束),让我们重新格式化输入字符串,这样我们永远不会陷入这种情况。我写了一个正则表达式,总是有正确格式化的varchar输入字段
我现在正在使用它:
public string AllowedAsci(string input, string symbol="*")
{
return Regex.Replace(input, @"[^a-zA-Z0-9-+_@., ]", symbol);
}
这基本上是基本电子邮件和数字的严格正则表达式,我的问题是这个正则表达式可以扩展其他安全使用符号。
重要更新
这个问题的关键点从来没有提出过关于使用mysql参数的讨论,我知道从一开始,虽然政治在起作用,但这里是我不允许触及的代码分支。目前我没有打算(再次)进入工作中的争论,也没有触及那些代码,我最终可能会将它们归咎于政治。
所以请继续关注什么是一个好的正则表达式来删除转义码,但另一方面允许不允许注入的字符串。
答案 0 :(得分:0)
我想我们可以回答一下,如果你的功能是安全的并不重要,因为你的同事的前提是不安全的。
一个问题是,即使您只允许“安全”字符,也有使用安全字符编码恶意输入的方法,但它会做一些不安全的事情。
我在这个旧答案中找到了这个恶意输入的例子: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
如果你为那些会打你的人工作,而不是感谢你找出安全漏洞,你应该私下与你的共同经理谈谈并要求转到另一个部门。如果无法做到这一点,请开始寻找其他工作。
与此同时,做他们告诉你的事情,但坚持进行代码审查。让他们批准,然后给你的经理写一封电子邮件,证明你的代码即使有安全漏洞也能获得批准。