Estoy desarrollando una aplicación web usando F #. Pensando en proteger las cadenas de entrada del usuario de SQL, XSS y otras vulnerabilidades.Restricciones de tiempo de compilación para cadenas en F #, similares a las Unidades de medida: ¿es posible?
En dos palabras, necesito algunas limitaciones de tiempo de compilación que me permitiera discriminar cadenas de civil de aquellos que representan SQL, URL, XSS, XHTML, etc.
Muchas lenguas tienen, por ejemplo, La función de interpolación de cuerdas nativa de Ruby #{...}
.
Con F #, parece que las Unidades de medida funcionan muy bien, pero solo están disponibles para los tipos numéricos.
Existen varias soluciones que emplean runtime UoM (link), sin embargo, creo que es una sobrecarga para mi objetivo.
He mirado en FSharpPowerPack, y parece muy posible llegar a algo similar para cadenas:
[<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)
Nota: Es sólo una muestra; no sugiera usar SqlParameter
. :-)
Mis preguntas son: ¿Hay una biblioteca decente que lo haga? ¿Hay alguna posibilidad de agregar azúcar sintaxis?
Gracias.
Actualización 1: Necesito restricciones de tiempo de compilación, gracias Daniel.
Actualización 2: Estoy tratando de evitar cualquier sobrecarga del tiempo de ejecución (tuplas, estructuras, uniones discriminadas, etc.).
Ver http://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem para un interesante Haskell asumir el problema. – kvb
Bueno, si intentas implementar esto, ¡me interesaría verlo! – Benjol
@kvb, tu enlace parece estar muerto ... déjame poner un enlace de trabajo solo para mí :) http://blog.moertel.com/posts/2006-10-18-a-type-based- solution-to-the-strings-problem.html – moudrick