Par les temps qui courent, un développeur qui désire une application sécurisée ... doit être un peu parano si il veut penser à tout...
Dans le cas, d'une application Web, la liste des fondamentaux en matière de sécurité, peut être très longues...
- Validation des entrées (injection de code SQL)
- Sécurité au niveau des champs cachés (visible par le code source)
- Sécurité au niveau Ajax (des failles sont encore exploitable)
- Sécurité au niveau Cookies
- Gestion de l'application si l'on essaye de vous envoyer 10000 requêtes d'un coup.
- Cryptage des données sensibles
- Gestion des pools
- ....etc...
Bref, la liste des tâches à vérifier peut être très rapidement rébarbatif.
Je vais pour l'instant vous faire une check-list de ce qu'un Web.config sécurisé devrait contenir :
Un web.config sécurisé devrait suivre ces recommandations :
- les connectionStrings doivent être cryptées en utilisant aspnet_regiis.exe .
- toutes les sections de configurations contenant des user credentials ou des données sensibles doivent être cryptées en utilisant aspnet_regiis.exe.
- L'élément Trace doit être désactivée de l'application et customErrors mode doit être à "On", car l'utilisateur ne doit pas voir de détail sur les exceptions levées par le CLR.
- Les balises d'autorisation doivent être convenablement configurées avec la liste des roles,users ou verbs devant être "allow" ou "deny".
- l'Impersonation doit être désactivé si non requise.
- L'objet Session doit être désactivé si non utilisé.
- un niveau de confiance (Trust level) est appliqué à votre application et il ne doit pas authorisé plus de droits que ceux requis par votre application.
Afin de crypter une donnée dans votre Web.config
Vous pouvez utiliser la syntaxe suivante de l'utilitaire aspnet_regiis se trouvant dans le framework:
- aspnet_regiis -pef connectionStrings "c:\MyWebSite"
cela remplacera vos paramètres :
<connectionStrings>
<add name="PricingConnectionString" providerName="System.Data.SqlClient" connectionString="Data Source=18.254.45.95;Initial Catalog=PricingDev;Persist Security Info=True;Max Pool Size=1000;User ID=toto;Password=monmpwd;"/>
<add name="StartConnectionString" providerName="System.Data.OracleClient" connectionString="Server=STARTLIGHT;Uid=tata;Pwd=monmpwd"/>
</connectionStrings>
par :
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"><EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"xmlns="http://www.w3.org/2001/04/xmlenc#"> .... </KeyInfo> <CipherData> <CipherValue>pRHtzDzZICRStiEvb01laj3OkuaxFe3ip9fE0n5s76fKMveYCqp5F48CwIkmwQcMzaqDXdsOGN6oGHssfIH8BHuL9SC4nNaKcq+7AoguLalb5YUesnfa/xUhUoX1hZ8WILfekV/KMGcHuH39Q+sFCec+VPodyhBgTB8Tu7fa8F0=</CipherValue>
</CipherData>
</EncryptedKey></KeyInfo>
<CipherData>
<CipherValue>rfu++wRIW2FgvbzEPPqB6DRRgfEw6sLwX97fD6qj4YHCYekHu568mMQY+7kZCljdFIJbUGDlHDCtLKPk8piwdoxPJOobMuNiUG5eLpwcsPX3mUTrD7cRBMcYSy16qQLs9jnYrdzcf6rq9Y0/EFZrm1z/fesG/2eBHES2lq4ItdaQGhvUoJrv30VnLfSMpF63Gwli0aF/5Qig9e9d8BZlwRU7GsqvIy/vDCvmdAfgRN143oy16Y0yU6njl8stZruR0pvVrJRcEPzqctiOu2vdYemRpdFjM47l4Xt7ne4Jx9ER8q9W/IhUOIutUndEVVgqbRZ8D0RPj5WLFq8Gt4ZgO8RhGChz6crFuox0+lhx5mQicQpN5x1lySBeSDRJMk/u1UwmFWSKo6CrjS4QKc2U+/fekdf1rJMRVnyZZSx7rZNAsNg+cqMr5atD895pfAVFfdtYCs0VS+ud5AyahpGWUAI+CSDc6FvIOjCUgiK3uQOw7H6d+HDd9IvWhIxKYtEjz+gtZAec7Jk8Dbh9L7q6aaONXV8vGMBP2L56mHMYufBfZKT1XgmhdqXN4Wni7V6n</CipherValue>
</CipherData>
...
</
connectionStrings>
Attention la clé utilisée pour le cryptage est liée à la machine, donc si vous exportez le fichier Web.config sur un autre poste cela ne marchera pas.
Crypter toujours sur le serveur hébergeant l'application Web !
Lors de l'éxécution, ASP.NET décryptera lui même la chaîne de connexion.
si vous désirer décrypter le fichier manuellement lancer alors la commande ci-dessous :
- aspnet_regiis -pdf connectionStrings "c:\MyWebSite"