私はF#を使用してWebアプリケーションを開発しています。 SQL、XSS、その他の脆弱性からユーザー入力文字列を保護することを考えています。二つの単語でF#の文字列のコンパイル時の制約.Unit of Measureと同様ですか?
は、私は、例えば、
多くの言語がそれを持っているなど、XHTML、私はSQL、URL、XSSを表すものと無地の文字列を区別できるようになるいくつかのコンパイル時間の制約を必要としますRubyのネイティブ文字列補間機能#{...}
。
F#では、Measure単位は非常によく機能するようですが、数値型でのみ使用できます。
ランタイム UoM (link)を使用して解決策がいくつかありますが、それは私の目標のオーバーヘッドだと思います。
私はFSharpPowerPackに見てきた、そして文字列の類似した何かを思い付くことは可能と思われる:
[<MeasureAnnotatedAbbreviation>] type string<[<Measure>] 'u> = string
// Similarly to Core.LanguagePrimitives.IntrinsicFunctions.retype
[<NoDynamicInvocation>]
let inline retype (x:'T) : 'U = (# "" x : 'U #)
let StringWithMeasure (s: string) : string<'u> = retype s
[<Measure>] type plain
let fromPlain (s: string<plain>) : 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<plain> = 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:実行時のオーバーヘッド(タプル、構造体、識別された共用体など)を避けようとしています。
参照してください。面白いハスケルが問題に取り組むためのhttp://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem – kvb
これを実装しようとすれば、私はそれを見ることに興味があるでしょう! – Benjol
@kvb、あなたのリンクは死んでしまったようです... 自分自身のために働くリンクを入れましょう:) http://blog.moertel.com/posts/2006-10-18-a-type-based- solution-to-the-strings-problem.html – moudrick