我今天在Web应用程序中重构了一些代码,并在所有网页的基类中遇到了类似的内容:
if (Request.QueryString["IgnoreValidation"] != null)
{
if (Request.QueryString["IgnoreValidation"].ToUpper() == "TRUE")
{
SessionData.IgnoreValidation = true;
}
}
对我而言,这似乎是一个非常糟糕的事情,所以我立即从代码中删除了这个标志的所有痕迹。首先,有几个if语句遍布检查标志的值,导致逻辑混乱和不清楚。其次,我遇到了另一个更危险的标志“IgnoreCreditCardValidation”。你猜猜那个人做了什么......
然后我开始思考它,并记住了之前工作中的类似例子。在作为“安全身份验证模块”销售的应用程序的代码中,有一个QueryString参数用于覆盖默认行为,有效地允许任何知道它的人绕过身份验证。
现在我的问题更多的是确认,这种做法是否像在我脑海中那样糟糕,或者我只是反应过度而且这是司空见惯的?是否存在有正当理由这样做的情况?对我而言,这似乎是懒惰和粗心的混合物。
如果这是重复的,请随时指出我正确的方向。
谢谢!
答案 0 :(得分:4)
这是否是常见做法令人震惊。给你带来极端偏见的+1。
答案 1 :(得分:1)
我同意你的看法。特别是如果模块被设计为强制执行安全性,那么在发布版本中这是一个愚蠢的事情(在调试版本中也不是一个好主意,但这可能是合理的。)它本质上是安全逐朦胧。
答案 2 :(得分:1)
不是你。无论谁写过,都从未处理面向公众的Web应用程序。正如您所正确指出的那样,任何了解此“后门”的人都可能破坏您的应用程序。
答案 3 :(得分:1)
在设计和测试方面,原始开发人员都很懒惰。
理想的解决方案是将验证或信用卡认证等从代码分离到单独的dll / services / etc.然后可以用模拟代替真实版本以便于测试网站。这些服务也可以独立测试。
这些模拟永远不会到达生产服务器附近,所以你永远不应该在你的代码中有后门。
您也可以替换任何/所有服务而无需更新您的应用程序 - 只要新服务提供与原始服务相同的界面。
答案 4 :(得分:1)
我反对这种说法,并且说查询字符串是一个很好的调试开关。
在每个人都跳过我之前 - 使用查询字符串来禁用验证是非常愚蠢的,一个巨大的安全漏洞,并且永远不应该发生。你完全有效且有理由立即修改代码。
但是对于调试,查询字符串工作得很好。我们有几个查询字符串会为我们页面上的几个对象打开ID,因此我们可以快速获取它们而无需登录到生产数据库(当然不是每个人都可以访问Prod DB),或者用于检查计算组件。你只需要小心谨慎地了解它们。