PDA

View Full Version : [ASP.NET][C#] Prevenire attacchi cross-site scripting


uReverendo
31-10-2008, 13:35
Mi sono accorto che quando eseguo manualmente il binding di dati potrei esporre il sito ad attacchi cross-site scripting.

Ad esempio in questo codice:

// Recupero le categorie e le associo al controllo.
CategoriesManager catMan = new CategoriesManager();
chklistCategories.DataSource = catMan.GetAllCategories();
chklistCategories.DataTextField = "Name";
chklistCategories.DataValueField = "IdCategory";
chklistCategories.DataBind();

// Recupero i ruoli e li associo al controllo.
chklistRoles.DataSource = Roles.GetAllRoles();
chklistRoles.DataBind();

In pratica se creo una categoria o un ruolo con questo nome:

<script type="text/javascript">alert('boom!');</script>

il testo viene eseguito anzichè visualizzato.

Mi rendo conto che dovrebbe essere impossibile inserire una categoria così chiamata, però siccome occorre considerare ogni input (anche se viene restituito da un database) malevolo, il codice non è sicuro.

Come posso risolvere il problema?

dierre
31-10-2008, 15:12
In generale un controllo va fatto prima che il dato venga inserito, di conseguenza il controllo lo devi fare sul form dove vengono inseriti i dati.

Tu vuoi sapere COME fare il controllo?

Leggi qui, penso faccia al caso tuo: http://msdn.microsoft.com/en-us/library/ms972967.aspx

uReverendo
31-10-2008, 19:16
Oltre al controllo in fase di inserimento, intendo eseguire anche un controllo in fase di presentazione dei dati.
In pratica non voglio dare per scontato che i valori contenuti nel database siano sicuri.

Per capirci devo fare questo:

CategoriesManager catMan = new CategoriesManager();

chklistCategories.Items.Clear();

foreach (Category c in catMan.GetAllCategories())
{
ListItem item = new ListItem();
item.Text = HttpUtility.HtmlEncode(c.Name);
item.Value = c.IdCategory.ToString();
chklistCategories.Items.Add(item);
}

così ho la certezza che nulla venga eseguito.

La mia domanda è: come faccio ad ottenere lo stesso risultato utilizzando il databinding?

dierre
31-10-2008, 19:55
chklistCategories.DataTextField = HttpUtility.HtmlEncode("Name");
chklistCategories.DataValueField = HttpUtility.HtmlEncode("IdCategory");

facendo così non va bene? Purtroppo ASP.Net non ne so mezza.

uReverendo
01-11-2008, 15:45
No che non va bene... in quel modo codifichi solo la stringa "Name" :fagiano:

Va bè, vorrà dire che farò così:

CategoriesManager catMan = new CategoriesManager();

chklistCategories.Items.Clear();

foreach (Category c in catMan.GetAllCategories())
{
ListItem item = new ListItem();
item.Text = HttpUtility.HtmlEncode(c.Name);
item.Value = c.IdCategory.ToString();
chklistCategories.Items.Add(item);
}


Grazie lo stesso.