هنگام نمايش اطلاعات در وب بايد اطلاعات خام دريافتي از كاربر را encode كرده و سپس نمايش داد تا از حملات XSS يا cross site scripting attacks در امان ماند. مثلا وبلاگي را طراحي كردهايد و يك نفر اطلاعات زير را بجاي توضيحات ارسال كرده است:
<SCRIPT>alert('XSS')</SCRIPT>
مايكروسافت براي اين منظور Microsoft Anti-Cross Site Scripting Library را ارائه داده است. نمونه بهبود يافته HttpUtility.HtmlEncode كه در فضاي نام System.Web موجود است.
در اينجا قصد داريم اين كتابخانه را با ليست زير آزمايش كنيم:
http://ha.ckers.org/xss.html
در همان صفحه اگر دقت كنيد، ليست حملات را به صورت يك فايل xml هم ارائه داده است:
http://ha.ckers.org/xssAttacks.xml
براي خواندن اين فايل xml در دات نت روشهاي زيادي وجود دارد منجمله XML serialization .
ساختار اين فايل به شكل زير است:
<?xml version="1.0" encoding="UTF-8"?>
<xss>
<attack>
<name>x1</name>
<code>x2</code>
<desc>x3</desc>
<label>x4</label>
<browser>x5</browser>
</attack>
.
.
.
public class attack{
public string name { get; set; }
public string code { get; set; }
public string desc { get; set; }
public string label { get; set; }
public string browser { get; set; }
}
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
public static List<attack> DeserializeFromXML(string path)
{
XmlRootAttribute root = new XmlRootAttribute("xss");
XmlSerializer deserializer =
new XmlSerializer(typeof (List<attack>),root);
using (TextReader textReader = new StreamReader(path))
{
return (List<attack>)deserializer.Deserialize(textReader);
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Microsoft.Security.Application;
private static void testMethod()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("<html>{0}", Environment.NewLine);
sb.AppendFormat("<body>{0}", Environment.NewLine);
List<attack> data = XMLParser.DeserializeFromXML("xssAttacks.xml");
foreach (attack atk in data)
{
string cleanSafeHtmlInput = AntiXss.HtmlEncode(atk.code);
sb.AppendFormat("{0}<br>{1}", cleanSafeHtmlInput, Environment.NewLine);
}
sb.AppendFormat("</body>{0}", Environment.NewLine);
sb.AppendFormat("</html>");
File.WriteAllText("out.htm", sb.ToString());
}