Ограничения времени компиляции для строк в F #, аналогичные единицам измерения - возможно ли это?

Я разрабатываю веб-приложение с использованием F #. Подумайте о защите строк ввода пользователя от SQL, XSS и других уязвимостей.

В двух словах, мне нужны некоторые ограничения времени компиляции, которые позволили бы мне отличать простые строки от строк, представляющих SQL, URL, XSS, XHTML и т. Д.

Это есть во многих языках, например Встроенная в Ruby функция интерполяции строк # {...} .
С F # кажется, что единицы измерения работают очень хорошо, но они доступны только для числовых типов.
Есть несколько решений, использующих время выполнения UoM (ссылка) , однако я думаю, что это накладные расходы для моей цели.

Я изучил FSharpPowerPack, и мне кажется вполне возможным придумать нечто подобное для строк:

[] type string<[] 'u> = string
// Similarly to Core.LanguagePrimitives.IntrinsicFunctions.retype
[]
let inline retype (x:'T) : 'U = (# "" x : 'U #)
let StringWithMeasure (s: string) : string<'u> = retype s

[] type plain
let fromPlain (s: string) : string =
    // of course, this one should be implemented properly
    // by invalidating special characters and then assigning a proper UoM
    retype s

// Supposedly populated from user input
let userName:string = StringWithMeasure "John'); DROP TABLE Users; --"
// the following line does not compile
let sql1 = sprintf "SELECT * FROM Users WHERE name='%s';" userName
// the following line compiles fine
let sql2 = sprintf "SELECT * FROM Users WHERE name='%s';" (fromPlain userName)

Примечание : Это всего лишь образец; не предлагайте использовать SqlParameter . : -)

Мои вопросы: есть ли достойная библиотека, которая это делает? Есть ли возможность добавить синтаксический сахар?
Спасибо.

Обновление 1 : мне нужны ограничения времени компиляции, спасибо Дэниел.

Обновление 2 : я пытаюсь избежать любых накладных расходов времени выполнения (кортежи, структуры, размеченные объединения и т. Д.).

15
задан bytebuster 15 December 2012 в 22:53
поделиться