我正在建立一个网站,用户可以使用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
这样的事情,应该是如此。我有三个问题。
username
和password
字符串没有转义。这很重要,因为有一个网站将任何收到的输入传递给此函数。password
传递给kinit
进程echo password |
。是否有一些函数作为参数采用标准?username
,username
应作为参数传递。我认为rawSystem
解决了这个问题。是否有任何系统功能可以帮助我在这里?
答案 0 :(得分:6)
使用createProcess
和来自System.Process
的朋友。
关于安全性的说明:我建议不要通过未解释的方式传递任何字符串。您可以轻松地为命令编写解析器,从保证安全的解析结果中构建Haskell AST,然后将其呈现给系统命令。这样,您就可以获得针对字符串注入攻击的静态保证,由解析器的类型强制执行。