我阅读了Fortify静态检查工具的一些文档。该工具使用的一个概念被称为taints。某些来源(例如Web请求)提供的数据在一个或多个方面上都是不可信的,而某些汇(例如Web响应)需要数据是可信的。
Fortify的好处在于可以有几种类型的taints。例如,您可以使用 NON_CRYPTO_RAND
标记 srand
输出,然后要求在用于加密目的时不存在这种taint。其他示例包括未经绑定检查的数字等。
在Haskell或其他使用更复杂类型系统的编程语言中是否可能使用更强的静态类型系统对taints进行建模?
在Haskell中,我可以定义这样的类型:Tainted [BadRandom,Unbounded] Int
,但与它们一起计算似乎非常困难,因为这种新类型也会限制不限制taints的操作。
是否有更好的方法来完成这项工作?是否有关于此主题的任何现有工作?
IO
单子模拟了与真实世界交互的最严重的污染。你可以创建一个类似于MonadIO
的MonadTaint
类型类,然后将你的BadRandom
和Unbounded
类型作为它的实例。 - cdkIO
采用的方法。另一种是只接受在构造函数中的数据,并要求使用特殊方法将其放入。Haskell对后者提供了更多支持,包括类型类支持。与其展示一个值不适合某个目的(不足够随机),然后在使用它之前未能展示它不适合该目的(不足够随机),您可以展示它足够随机并要求相同。 - Cirdec