Cross Site Scripting - XSS - Part4

سلام دوستان عزیز.

در این قسمت میخوایم به بررسی بعضی نکات در زمان استفاده از Output Encoding بپردازیم. این قسمت در ادامه قسمتهای قبلی میباشد و اگه قسمتهای قبلی را نخوندید میتونید از لینکهای زیر استفاده کنید:

Cross Site Scripting - XSS - Part1

Cross Site Scripting - XSS - Part2

Cross Site Scripting - XSS - Part3

 

ASP.NET Controls  و  Output Encoding:

در بعضی از کنترلهای ASP.NET بصورت اتوماتیک HTML Encoding یا URL Encoding یا JavaScript Encoding انجام میپذیرد. برای مثال در کنترل TextBox در مشخصه Text، HTML Encoding انجام میگیرد. بنابراین اگر بنا به دلایلی نمیخواهید از کتابخانه هایی مثل AntiXSS یا ESAPI استفاده نمایید مهم است که رفتار کنترلها را بشناسید و بدانید کدامیک از کنترلها از Encoding استفاده میکنند و کدامیک استفاده نمیکنند.

برای مشاهده لیست کامل کنترلها و اطلاع از نحوه Encoding به اینجا مراجعه فرمایید.

توجه شود که هرچند درTextBox  اینکار انجام میپذیرد اما اگر در برنامه شما  مشخصه Text خوانده شود HTML Encoding دیگر انجام نمیپذیرد. به مثال زیر توجه فرمایید:

string message = txtMessage.Text;

<%=message %>

 

در تکه کد بالا message بصورت HTML Encode در خروجی قرار میگیرد اما در مثال زیر این اتفاق نمی افتد.

private void btnSubmit_Click(object sender, System.EventArgs e)

{

    lblGreeting.Text = txtMessage.Text;

}

Data Binding و Output Encoding:

در مثال زیر از Eval برای Binding استفاده شده است:

 

<asp:Repeater ID="Repeater2" runat="server">

  <ItemTemplate>

    <%# Eval("YourField") %>

  </ItemTemplate>

</asp:Repeater>

 

مثال فوق آسیب پذیر میباشد. اصولا فرمت <%#%> کار HTML Encoding را انجام نمیدهد و آسیب پذیر میباشد. برای اصلاح کد بالا از AntiXSS.Encoder.HTMLEncode استفاده نمایید.

اما زمانیکه از ()Bind استفاده میکنید در حالتیکه کنترلی که متن به آن Bind میشود HTML Encode را انجام میدهد (مانند TEXTBOX) برنامه آسیب پذیر نمیباشد. برای مثال کد زیر آسیب پذیر نیست.

 

<asp:Repeater ID="Repeater1" runat="server">

    <ItemTemplate>

      <asp:TextBox ID="txtYourField" Text='<%# Bind("YourField") %>'

        runat="server"></asp:TextBox>

    </ItemTemplate>

  </asp:Repeater>

 

اما در صورتیکه کنترل HTML Encoding را پشتیبانی نمیکند بدلیل اینکه نمیتوان از AntiXSS.Encoder.HTMLEncode همراه با ()Bind استفاده نمود بجای آن بهتر است از ()Eval استفاده شود تا از  AntiXSS.Encoder.HTMLEncode برای رفع آسیب پذیری استفاده شود.

 ASP.NET MVC و Output Encoding

در ASP.NET MVC بدلیل اینکه مفهوم Data Bindingبه شکل فوق وجود ندارد میبایستی دقت شود کهHTML helpers کار Encoding را انجام میدهند یا خیر. برای مثال HTML Helper برای Label ,  TextBox کار HTML Encoding را انجام میدهند. برای مثال کد زیر:

 

@Html.TextBox("customerName", "<script> alert('bip')</script>")

@Html.Label("<script> alert('bip')</script>")

بصورت زیر تبدیل میشود:

<input id="customerName" name="customerName" type="text"

 value="&lt;script>alert(&#39;bip&#39;)&lt;/script>" />

 

 <label for="">&lt;script&gt;alert(&#39;bip&#39;)&lt;/script&gt;</label>

 

در غیر اینصورت از () Html.Encode و() Html.AttributeEncode استفاده نمایید.

<%= Html.Encode(ViewData["UserInput"]) %>

<p class="< %= Html.AttributeEncode(ViewData["CssClass"]) %> "> Example </p>

 

برای  encoding در URL نیز میتوانید از URLHelper به شکل () URL.Encode استفاده نمایید.

<a href=" <%= Url.Encode(Url.Action("index", "viewProfile",

                                         new {name= ViewData["Name"]})) %>

 

با این همه در ASP.NET MVC 4 امکان  استفاده از AntiXSS به عنوان Default Encoder وجود دارد. برای اینکار در برنامه یک Reference به اسمبلی AntiXSS میدهید و سپس در web.config  در قسمت <system.web> خط زیر را اضافه کنید:

    <httpRuntime encoderType=

        "Microsoft.Security.Application.AntiXssEncoder, AntiXssLibrary"/>

خوب دوستان گرامی به انتهای این قسمت رسیدیم.

در قسمت بعدی روشهای پیشگیری در DOM-Based XSS مورد بررسی قرار خواهند گرفت.

پیروز و موفق باشید.

 

/ 0 نظر / 51 بازدید