优雅的系统调用haskell

Tar*_*sch 6 haskell kerberos system-calls

我正在建立一个网站,用户可以使用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 
Run Code Online (Sandbox Code Playgroud)

这样的东西,应该工作得一般.我有三个问题.

  • 没有的转义usernamepassword字符串.这很重要,因为有一个网站将任何收到的输入传递给此功能.
  • 理想情况下password不应该传递给kinit进程echo password |.是否有一些功能作为参数采用标准?
  • 同样username,username应该作为参数传递.我想rawSystem虽然解决了这个问题.

是否有任何系统功能可以帮助我在这里?

Don*_*art 6

使用createProcess和朋友System.Process.


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

  • 谢谢.为了将来的参考,我想指出`readProcessWithExitCode`最适合我.另一件事,安全地转义shell参数的字符有什么必要?如果String实际上作为参数传递给`readProcessWithExitCode`,它甚至是必要的吗? (2认同)