Monday, June 11, 2007

การป้องกันการโจมตีแบบ Cross Site Scripting (XSS)

การโจมตีแบบ XSS เป็นการโจมตีแบบ Injection Attack รูปแบบหนึ่งที่อาศัยช่องโหว่ของการเขียนโค้ดในการรัีบ input data ต่างๆ เช่น field, query string และ cookie เพื่อการฝังโค้ดสคริปต์ เ่ช่น javascript ในการโจมตี

เช่น
<%@ Language="C#" ValidateRequest="false" %>
<html>
<script runat="server">
void btnSubmit_Click(Object sender, EventArgs e)
{
// If ValidateRequest is false, then 'hello' is displayed
// If ValidateRequest is true, then ASP.NET returns an exception
Response.Write(txtString.Text);
}
</script>
<body>
<form id="form1" runat="server">
<asp:TextBox id="txtString" runat="server"
Text="<script>alert('hello');</script>" />
<asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"
Text="Submit" />
</form>
</body>
</html>
เมื่อ run เพจนี้จะปรากฏข้อความ "Hello" เป็น message box ขึ้นมา เนื่องจากสคริปต์ใน txtString ได้ส่งเข้่ามาและถูก render เป็นไคลเอ็นต์ไซต์สริปต์ในเว็บบราว์เซอร์

การป้องกัน XSS
1. กำหนดแอตทริบิวต์ validateRequest="true" ใน configuration ไฟล์ หมายความว่า จะมีการตรวจจับทุก HTML และ character ต่างๆที่จะส่งไปยังเซิร์ฟเวอร์ ถ้ามีการส่งสคริปต์ก็จะถูกตรวจพบและแสดงข้อความผิดพลาดประเภท HttpRequestValidataionException ขึ้นมา
ตัวอย่างการกำหนด
...
<pages validateRequest="true"/>
...
ซึ่งการกำหนด validateRequest โดย default จะกำหนดให้เป็น true อยู่แล้ว
2. กำหนดข้อบังคับในการ input เช่น มีการตรวจสอบ input ฝั่งเซิร์ิฟเวอร์เสมอ, กำหนด length, range, format และ type ที่แน่นอนให้กับแต่ละ input เป็นต้น โดยการใช้ RegularExpressionValidator, Regex Class, RangeValidator, CustomValidator
3. ทำการ Encode ข้อมูล output ที่ไม่น่าไว้ใจ โดยการใช้ HttpUtility.HtmlEncode หรือ HttpUtility.UrlEncode และ Encode URL ที่ไม่น่าไว้วางใจโดยใช้ HttpUtility.UrlEncode

เช่น

<%@ Page Language="C#" ValidateRequest="false" %>

<script runat="server">
void submitBtn_Click(object sender, EventArgs e)
{
Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));
}
</script>

<html >
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="inputTxt" Runat="server"
TextMode="MultiLine" Width="382px" Height="152px">
</asp:TextBox>
<asp:Button ID="submitBtn" Runat="server" Text="Submit"
OnClick="submitBtn_Click" />
</div>
</form>
</body>
</html>
    HttpUtility.UrlEncode(urlString);

เนื้อหาอ้างอิงจาก http://msdn2.microsoft.com/en-us/library/bb355989.aspx

No comments: