我阅读了这个邮件胁迫:四种方法比较,其中讨论了类型转换的方法。
在第一种方法中,String被用作通用的表示形式,每一种想要转换到或从其他类型转换的类型都只会使自己成为类型类型Show和Read的实例。
然而,这会不会引起安全问题?是否有一种方法可以让输入以类似于SQL注入的方式劫持流程?
发布于 2015-11-01 12:26:21
假设攻击者只能为这些值提供文本表示,而对于representation,则意味着在解析输入时执行任意代码:,no,。
假设您控制了Show和Read的实例,并且非常小心地保持代码的纯正性,那么不管攻击者提供了什么输入,代码都是纯的,没有副作用,因此不可能像"SQL注入“这样的东西。
显然,攻击者可以提供一个需要大量时间/资源来解析的输入,但这是一种DoS攻击,与类似于SQL注入的攻击不同。
发布于 2015-11-01 12:26:29
在我头上,当它不安全的时候,它是一个明显的方式。因此,基本上:不要相信read从任何人那里得到的任何输入。它是用于反序列化的,所以当您进行反序列化时,创建一个函数来检查您接收的数据是否正常。
否则,用户可以轻松地更改输入(show生成非常简单的文本),并绕过智能构造函数。另一种处理此问题的方法是创建自定义的、更安全的实例。例如,许多容器序列化为:fromList [1,2,3],而不是show对底层结构进行序列化。不会有太多问题的。
下面是一个数据类型的GHCi会话,该数据类型是一个具有Int大小的列表:
data LList a = LList [a] Int deriving (Eq, Ord, Show, Read)
let mkLList xs = LList xs (length xs)
-- Module would only expose (LList, mkLList)
read "LList [6,4,2] 6548" :: LList Int
> LList [6,4,2] 6548现在我们有一个长度为6548元素的LList .但我们只有三个。
https://stackoverflow.com/questions/33462015
复制相似问题