ASP.NET MVC3 et le ValidateInput(false)

Qui n’a pas rencontré le problème de validation sur ASP.NET MVC3 : A potentially dangerous Request.Form value was detected from the client.

En WebForm il est simple de corriger ce problème et je ne m’étendrait pas dessus de nombreux site décrive comment procéder.

En ASP.NET MVC3, l’attribut [ValidateInput(false)] sur la méthode de votre controlleur est sensé régler le problème.

Mais dans ce cas :

Test.cshtml

@{
    ViewBag.Title = "Test";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Test</h2>

<p>@Html.Raw( ViewBag.k)</p>

@using (Html.BeginForm())
{
<span style="font-size: 12px; line-height: 18px;">
</span>    <p><input type="text" name="toto" ><input type="submit" /></p>;
}

HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [ValidateInput(false)]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!"+ Server.MachineName;

            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        [ValidateInput(false)]
        public ActionResult Test()
        {
            string k = "";

            foreach (string key in Request.Form.Keys)
            {
                k += key + " : " + Request.Form[key] + "; ";

            }
            ViewBag.k = k;

            return View();
        }
    }
}

si vous entrez le texte : ” coucou <br/> bonjour” dans le champ texte, et que vous soumettez le formulaire par un clic sur le bouton Valider, Malgré l’utilisation des attributs [ValidateInput(false)], Vous aurez la page habituelle d’erreure…

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (toto="<fdfdsdf>").]
   System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8812804
   Microsoft.Web.Infrastructure.DynamicValidationHelper.<>c__DisplayClass12.<ReplaceCollection>b__d(String value, String key) +79
   Microsoft.Web.Infrastructure.DynamicValidationHelper.LazilyEvaluatedNameObjectEntry.ValidateObject() +89
   Microsoft.Web.Infrastructure.DynamicValidationHelper.LazilyValidatingHashtable.get_Item(Object key) +54

La solution :

Utilisez la classe System.Web.Helpers.Validation :

foreach (string key in System.Web.Helpers.Validation.Unvalidated(Request).Form.Keys)
{
     k += key + " : " + System.Web.Helpers.Validation.Unvalidated(Request).Form[key] + "; ";
}

Vous n’aurez ainsi plus d’erreurs de validation.

VirtualBox et le problème du “Cannot register hard disk because … UUID … already exists”

Lorsque vous dupliquez un disque virtuel (copier/coller d’un fichier vdi ou vhd) pour l’utiliser dans virtualbox, vous allez être confronté au problème de l’identifiant du disque qui doit être unique.

Pour éviter d’être confronté au problème vous pouvez utiliser la commande permettant de cloner un disque fournie dans l’outil VBoxManage en ligne de commande. Cette commande lors de la copie du disque va changer l’UUID du disque de manière à ne pas avoir ce problème.

VBoxManage clonehd chemin_disque_source chemin_disque_a_copier

Mais bien souvent on effectue d’abord la copie du disque et ensuite on se rend compte du problème. Le plus simple est alors de changer cet UUID sur la copie, ce qui est souvent bien moins long que de lancer une commande ‘clonehd’ du disque. Et la encore une commande existe pour simplement changer l’UUID d’un disque existant :

VBoxManage internalcommands sethduuid chemin_du_disque_copié

VirtualBox Headless et ajouter des périphériques USB sous Windows

Un petit script pour répondre a une problématique, comment ajouter en script un périphérique USB à une machine Virtuelle à l’aide de VirtualBox ?

Si vous exploitez une machine déportée pour héberger vos machines virtuelles, vous utilisez sans doute VBoxHeadless et un accès TSE pour accéder à ces dernières.

Mais comment connecter vos périphériques USB lorsque vous n’avez plus d’interface graphique ? Dans VirtualBox une série d’exécutables en ligne de commande est prévu pour effectuer des actions sur ces machines.

Dans ce cas précis, VBoxManage va nous servir.

Voici les commandes que vous utiliserez :


C:\VBox>VBoxManage list usbhost

Host USB Devices:

UUID: 00f631b2-118c-40f3-a5b6-9c5cc654c743
VendorId: 0x041e (041E)
ProductId: 0x401d (401D)
Revision: 0.1 (0001)
Manufacturer: Creative
Product: Creative WebCam NX Ultra
Current State: Available

l’utilisation de la commande :

VBoxManage controlvm "nom de ma vm" usbattach 00f631b2-118c-40f3-a5b6-9c5cc654c743

permet d’attacher la webcam à la machine virtuelle. Mais cet UUID change régulièrement donc difficile de créer un script simple.

J’ai donc créé un javascript vous permettant à partir du nom du produit d’ajouter le périphérique usb à la machine virtuelle.


cscript InstallByUUID.wsf "Creative WebCam NX Ultra" "nom de ma vm"

Contenu du script ( InstallByUUID.wsf ) :

<job>
<script language="JScript">

        var tmppath = "c:\\temp";
        var wtattach = "";

        var lastUUID = "";
        var producttofind = "";
        var found = false;

        function FindUUID(lineinfo)
        {
                if (lineinfo.indexOf('UUID:')==0)
                {
                        lastUUID = lineinfo.substring(20,56);
                }
                if (lineinfo.indexOf('Product:')==0)
                {
                        var product = lineinfo.substring(20);
                        if (product == producttofind)
                                found = true;
                }
        }

        if (WScript.Arguments.length<2)         {                 WScript.echo("InstallByUUID.wsf [ProductNameofUSBItem] [NameOfVmToAttach]");                 exit(0);         }                  producttofind = WScript.Arguments(0);                          var objShell = WScript.CreateObject("WScript.Shell");         objShell.Run('cmd /C ""c:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" list usbhost > '+tmppath+'\\usbatach.txt"', 0, 1);

        var objFileSystem = WScript.CreateObject("Scripting.FileSystemObject");
        var objFile = objFileSystem.OpenTextFile(tmppath+'\\usbatach.txt');
        while ((!objFile.AtEndOfStream)&&(!found))
        {
                FindUUID( objFile.ReadLine( ));
        }
        objFile.Close();

        objFileSystem.DeleteFile(tmppath+'\\usbatach.txt');

        if (!found)
        {
                WScript.echo(producttofind +' n\'a pas été trouvé');
        }

        var runcmd = 'cmd /C ""c:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe" controlvm "'+WScript.Arguments(1)+'" usbattach '+lastUUID+'"';
        objShell.Run(runcmd, 0, 1);
        //WScript.echo(runcmd);
</script>
</job>

Pourquoi Outlook cache t’il les images par défaut ?

Par défaut lorsque vous ouvrez un mail, Outlook n’affiche pas les images venant du Web et vous demande si vous souhaitez les afficher. Dans mon entourage un certain nombre de personne me font la réflexion que c’est perdre du temps de devoir cliquer sur afficher.

Mais alors pourquoi ?

La réponse est simple : pour vous protéger !

Mais de quoi ?
Voila deux raisons :
– Des virus exploitant un bug dans le programme affichant les images à l’écran.
– De la confirmation de lecture du mail sans votre consentement.

Malheureusement le SPAM étant ce qu’il est à l’heure actuelle, il vaut mieux pour éviter de recevoir trop de courrier non sollicité de confirmer que votre adresse mail existe vraiment. Et c’est ce que permettent les images insérées dans les mails.

Explications :

Lorsque votre outil de courrier préféré reçoit un mail avec une image pointant sur internet, il va se connecter au serveur distant pour aller chercher l’image. A ce moment la le serveur distant va noter que vous vous êtes connecté et noter précieusement que votre adresse mail est valide. Cela lui permettra de se faire un petit peu d’argent sur votre dos, car un mail commercial qui a été lu est payé plus cher qu’un mail dont on ne sait pas s’il a été lu ou pas. De même votre adresse email sera revendue plus cher si on a confirmation qu’il y a un être humain derrière. Et vous financerez indirectement les SPAM qui polluent nos boite aux lettres.

Il en va de même pour la confirmation de lecture de messages. Il est déconseillé pour les même raisons que cité précédemment de l’activer en automatique. Si vous avez le courage activé la à la demande. La situation la plus simple est de la désactiver totalement.