【问题标题】:Elegant system calls in haskellHaskell 中优雅的系统调用
【发布时间】:2011-06-12 18:04:46
【问题描述】:

我正在创建一个用户可以使用 kerberos 服务登录的网站。不过,这与我的问题无关。

由于我使用的是 kerberos,我想使用系统调用来调用 kinit,但我不知道最好的方法。

到目前为止,我得到了:

module Kerberos where

system :: String -> IO ExitCode
-- system is loaded through imports

type Username = String
type Password = String

kerberosValidate :: Username -> Password -> IO Bool
kerberosValidate username password = fmap (== ExitSuccess) $ 
  system $ "echo " ++ password ++ " | kinit " ++ username 

类似的东西,应该可以正常工作。不过我有三个问题。

  • usernamepassword 字符串没有转义。这很重要,因为有一个网站将收到的任何输入传递给此函数。
  • 理想情况下,password 不应通过echo password | 传递给kinit 进程。是否有一些函数将标准作为参数?
  • username 类似,username 应作为参数传递。我认为rawSystem 解决了这个问题。

有什么系统功能可以帮助我吗?

【问题讨论】:

  • 您可能想要使用createProcess 并将您的输入传送到孩子的stdin
  • @n.m.:你可能应该把它作为一个答案——据我所知,它可以巧妙地处理后两个问题。如果有用的话,简短的答案很好,而 cmets 经常被忽视。

标签: haskell kerberos system-calls


【解决方案1】:

使用createProcess 和来自System.Process 的朋友。


关于安全性的说明:我建议不要通过未解释的方式传递任何字符串。您可以轻松地为您的命令编写解析器,从保证安全的解析结果构建 Haskell AST,然后将其呈现给系统命令。这样,您将获得针对字符串注入攻击的静态保证,由解析器的类型强制执行。

【讨论】:

  • 谢谢。为了将来参考,我想指出readProcessWithExitCode 最适合我。另一件事,为 shell 参数安全地转义字符需要什么?如果字符串实际上作为参数传递给readProcessWithExitCode,是否还有必要?
猜你喜欢
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多