Mar
16

HTML Güvenliği

Uygulamamızı internete açtığımızda birşeyi hiç unutmamalıyız. Sayfa Güvenliği!

Sayfalarımızın kötü niyetli kişilerin gazabına uğramasını istemiyorsak, bir takım güvenlik unsurlarını bilmekte fayda var. Her ne kadar kullanıcılardan giriş aldığımız formlarda client-side kontrolleri sağlasakta bazı kötü niyetli kişiler bu kontrolleri kolaylıkla aşarak istedikleri verileri sistemimize gönderebilirler. Bunlar sql injection denemeleri olabileceği gibi, kötü niyet içeren bir script kod bloğu, farklı bir sayfaya yönlendirilebilen meta veya iframe kod parçaçığı olabilir.

Bu sebeple client-side kontrollerin yanında server-side kontrolleride kullanmamız çok önemlidir. Kullanıcıdan aldığımız verinin doğruluğunu ve güvenli bilgi içeriğ içermediğini yazacağımız kodlar ile kolaylıkla kontrol altında tutabiliriz.

Örneğin bloğumuzun yorum bölümünde yer alan forumda yorum alanına (zengin metin editörü kullandığımızı hayal edebilirsiniz) girilen ifadelerin iyi niyetli mi kötü niyetli mi olduğunu kontrol edebilecek yardımcı kodları şu şekilde kontrol edebiliriz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
private static readonly Regex HtmlTagExpression = new Regex(@"(?'tag_start'</?)(?'tag'\w+)((\s+(?'attr'(?'attr_name'\w+)(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+)))?)+\s*|\s*)(?'tag_end'/?>)", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex WhiteSpaceBetweenHtmlTagsExpression = new Regex(@">(/w+)<", RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex HtmlLineBreakExpression = new Regex(@"<br(/s+)/>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
 
private static readonly Dictionary<string, List<string>> ValidHtmlTags = new Dictionary<string, List<string>> {
	{ "p", new List<string>() },
	{ "br", new List<string>() }, 
	{ "strong", new List<string>() }, 
	{ "b", new List<string>() }, 
	{ "em", new List<string>() }, 
	{ "i", new List<string>() }, 
	{ "u", new List<string>() }, 
	{ "strike", new List<string>() }, 
	{ "ol", new List<string>() }, 
	{ "ul", new List<string>() }, 
	{ "li", new List<string>() }, 
	{ "a", new List<string> { "href" } }, 
	{ "img", new List<string> { "src", "alt" } },
	{ "q", new List<string> { "cite" } }, 
	{ "cite", new List<string>() }, 
	{ "abbr", new List<string>() }, 
	{ "acronym", new List<string>() }, 
	{ "del", new List<string>() }, 
	{ "ins", new List<string>() }
};
 
public static string ToSafeHtml(string text)
{
	return RemoveInvalidHtmlTags(text);
}
 
public static string RemoveInvalidHtmlTags(string text)
{
	return HtmlTagExpression.Replace(text, new MatchEvaluator((Match m) => {
		if (!ValidHtmlTags.ContainsKey(m.Groups["tag"].Value))
			return String.Empty;
 
		string generatedTag = String.Empty;
 
		System.Text.RegularExpressions.Group tagStart = m.Groups["tag_start"];
		System.Text.RegularExpressions.Group tagEnd = m.Groups["tag_end"];
		System.Text.RegularExpressions.Group tag = m.Groups["tag"];
		System.Text.RegularExpressions.Group tagAttributes = m.Groups["attr"];
 
		generatedTag += (tagStart.Success ? tagStart.Value : "<");
		generatedTag += tag.Value;
 
		foreach (Capture attr in tagAttributes.Captures)
		{
			int indexOfEquals = attr.Value.IndexOf('=');
 
			if (indexOfEquals < 1)
				continue;
 
			string attrName = attr.Value.Substring(0, indexOfEquals);
 
			if (ValidHtmlTags[tag.Value].Contains(attrName))
				generatedTag += " " + attr.Value;
		}
 
		if (tagStart.Success && tagStart.Value == "<" && tag.Value.Equals("a", StringComparison.OrdinalIgnoreCase))
			generatedTag += " rel=\"nofollow\"";
 
		generatedTag += (tagEnd.Success ? tagEnd.Value : ">");
 
		return generatedTag;
	}));
}

Yukarıda yer alan kod ile “ValidHtmlTags” kitaplığında tanımlanmış HTML kodları dışında herhangi kötü niyetli bir HTML kod bloğu varsa temizlenecektir.

Gelen değeri aşağıdaki şekilde kullanabilirsiniz..

string result = ToSafeHtml(gelenveri);

Leave a comment

Sigames
Turksportal
LC Waikiki
Galatasaray SK

Kategoriler

Yorumlar