阶段:实施
假设所有输入都是恶意的。使用“接受已知的好的”输入验证策略,即使用严格符合规格的可接受输入列表。拒绝任何不严格符合规格的输入,或将其转换为可以做的事物。
执行输入验证时,请考虑所有潜在的相关属性,包括长度,输入类型,可接受值的全部范围,缺失或额外的输入,语法,跨相关字段的一致性以及符合业务规则的一致性。作为业务规则逻辑的一个示例,“船”可能在句法上有效,因为它仅包含字母数字字符,但是如果仅预期输入包含诸如“红色”或“蓝色”之类的颜色,则无效。
不要仅仅依靠寻找恶意或畸形的输入。这可能会错过至少一个不良的输入,尤其是如果代码的环境发生变化。这可以为攻击者提供足够的空间来绕过预期的验证。但是,拒绝者对于检测潜在攻击或确定哪些投入是如此畸形以至于应直接拒绝。
验证文件名时,请使用限制要使用的字符集的严格允许清单。如果可行,只允许一个“”。文件名中的角色,以避免弱点 CWE-23,并排除目录分离器,例如“/”以避免 CWE-36。使用允许文件扩展名的列表,这将有助于避免 CWE-434。
不要仅仅依靠去除潜在危险字符的过滤机制。这等同于派符者,这可能是不完整的( CWE-184)。例如,如果文件系统还支持使用“ \”作为目录分离器,则过滤“/”是不足的保护。当过滤以仍然产生危险数据的方式应用时,可能会发生另一个可能的错误( CWE-182)。例如,如果“ ../”序列从“ .../... //”字符串中取出,则将两个实例从原始字符串中删除,但其余的字符仍将形成“ ../”字符串。
|