【问题标题】:Input has quotes automatically added输入自动添加引号
【发布时间】:2017-11-21 21:29:20
【问题描述】:

我正在使用 Yesod 编写个人备份系统,并遇到了一个有趣的问题。谈到 Haskell,我相对缺乏经验,所以我确信这些都不是最佳的。

这是我的处理程序之一:

postHostR :: Text -> RcPath -> Handler Text
postHostR hostName f = do
  hostId <- insertIfDontExist hostName
  tBody <- (T.pack . show) <$> getRawRequest
  time <- lift getCurrentTime
  newId <- runDB $ insert $ RcFile hostId tBody (makePath f) time
  return $ T.pack $ show newId

我从数据库中检索到的任何文本都自动添加了双引号。我假设这是某种 XSS 安全性,但我并不担心,因为我不会渲染页面。引号似乎实际上并不是文本的一部分(我试过只去掉第一个和最后一个字符,但这似乎并没有真正删除引号)。

谢谢!

【问题讨论】:

  • 我猜其中一个show 电话是罪魁祸首,但我不熟悉所涉及的软件包。 show 用于什么类型?您可以通过将每个调用更改为 (show :: _) 并查看错误来找出答案。
  • 几乎可以肯定newIdTextString。注意show "abc" == "\"abc\""
  • 果然,你们都对。我在Text 类型的东西上做show,我想正确的做法是使用unpack 得到一个真正的字符串。请问有哪位能回答一下这个问题吗?

标签: haskell yesod persistent-storage


【解决方案1】:

此问题的通常原因是您有一个字符串,并且您在不需要时调用了show。 (大多数情况下,当他们真正想要 putStrLn x 时,有人会使用 print x。)

在你的情况下,我不确定类型签名,但我怀疑你的最后一行可以从

return $ T.pack $ show newId

只是

return newId

我怀疑newId 已经 Text,所以在它上面调用show 只会在它周围加上不需要的引号(并将它变成String,然后你使用@987654330 @ 变回Text)。如果你只是退回它,它可能会起作用。

(再说一次,我可能完全误解了类型签名;从这里很难分辨。)

【讨论】:

  • 就我而言,我在Text 上使用show 代替了我现在知道的应该是unpack。你的答案仍然成立。谢谢。
猜你喜欢
  • 2022-08-12
  • 1970-01-01
  • 2020-05-04
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多