Security 使用QueryString作为调试开关?

Security 使用QueryString作为调试开关?,security,debugging,Security,Debugging,我今天在一个web应用程序中重构了一些代码,在所有网页的基类中都遇到了类似的情况: if (Request.QueryString["IgnoreValidation"] != null) { if (Request.QueryString["IgnoreValidation"].ToUpper() == "TRUE") { SessionData.IgnoreValidation = true; } } 对我来说,这似乎是一件非常糟糕的事情™, 因此,

我今天在一个web应用程序中重构了一些代码,在所有网页的基类中都遇到了类似的情况:

if (Request.QueryString["IgnoreValidation"] != null)
{
    if (Request.QueryString["IgnoreValidation"].ToUpper() == "TRUE")
    {
        SessionData.IgnoreValidation = true;
    }
}
对我来说,这似乎是一件非常糟糕的事情™, 因此,我立即从代码中删除了该标志的所有痕迹。首先,检查标志值的if语句到处都是,导致逻辑混乱和不清楚。第二,我遇到了另一面更危险的旗帜,名为“IgnoreCreditCardValidation”。你可以猜到那个人做了什么

然后我开始思考这个问题,想起了以前工作中的一个类似例子。在作为“安全身份验证模块”出售的应用程序代码中,有一个QueryString参数用于覆盖默认行为,有效地允许任何了解该参数的人绕过身份验证

现在我的问题更像是一种确认,这种做法是否像我脑海中看起来的那样糟糕,还是我只是反应过度,这是司空见惯的?在任何情况下都有这样做的正当理由吗?对我来说,这似乎是懒惰和粗心的可怕结合

如果这是一个重复,请随时告诉我正确的方向


谢谢

不管这是不是普遍的做法,都很可怕+我感谢你用极端的偏见来抨击它。

我同意你的看法。特别是如果模块是为了加强安全性而设计的,那么在发布版本中使用这是一件愚蠢的事情(在调试版本中使用这也不是一个好主意,但这可能是合理的)。它本质上是隐蔽的安全性。

不是你。无论是谁写的,都从未处理过面向公众的web应用程序。正如您正确指出的那样,任何了解此“后门”的人都可能破坏您的应用程序

最初的开发人员在设计和测试方面都很懒惰

理想的解决方案是将验证或信用卡身份验证等从代码中分离出来,形成单独的DLL/服务/等。然后可以用模拟来替换真实版本,以便于对站点进行测试。这些服务也可以独立测试

这些模拟永远不会靠近生产服务器,因此您不应该在代码中设置后门


您也可以在不更新应用程序的情况下替换任何/所有服务,只要新服务提供与原始服务相同的接口。

我反对这种说法,我说查询字符串是很好的调试开关。

在所有人都攻击我之前-使用querystring来禁用验证是非常愚蠢的,是一个巨大的安全漏洞,永远不会发生。您完全有理由立即对代码进行检查


但是对于调试,查询字符串工作得很好。我们有一些查询字符串,可以打开页面上一些对象的ID,这样我们就可以快速获取它们,而无需登录到生产数据库(当然不是每个人都可以访问Prod DB),或者检查计算组件。你只需要对它们保持谨慎和聪明。

有人记得电影《战争游戏》中的后门吗?有人敲过你的门,还想知道为什么它们的忽略标志不再起作用吗?我甚至不会把它放在调试版本中,理由是一些蠢货可能会在我离开后将其发布。最好不要把坏主意灌输给别人。我永远不会把它灌输给别人,但我不会在没有进一步研究的情况下把它去掉。也许有些测试系统依赖它。你不应该在不知道你的行为后果的情况下这样做。如果测试系统依赖于它,那么测试系统需要重写,测试系统的编写者需要被鞭打。谁说有测试系统?不过,我同意,“在计划的停机时间”是确定这一点的正确时间。