Элегантные системные звонки в haskell - PullRequest
6 голосов
/ 12 июня 2011

Я создаю веб-сайт, на котором пользователи могут войти в систему с помощью сервиса 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 решает это все же.

Есть ли какая-нибудь системная функция, которая помогает мне здесь?

1 Ответ

6 голосов
/ 12 июня 2011

Используйте createProcess и друзей из System.Process.


Примечание по безопасности: я бы посоветовал не пропускать любые строки через неинтерпретированный. Вы можете легко написать синтаксический анализатор для ваших команд, построить AST на Haskell из результата анализа, который гарантированно безопасен, а затем передать его системной команде. Таким образом, вы получите статическую гарантию от атак с использованием строкового внедрения, поддерживаемых типом синтаксического анализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...