2012-07-26 34 views
21

Đầu tiên, tôi muốn cho mọi người biết rằng tôi đang sử dụng động cơ aspx chứ không phải động cơ Dao cạo.Làm cách nào để cho phép các thẻ HTML được gửi trong một hộp văn bản trong asp.net?

Tôi có một bảng trong một biểu mẫu. Một trong textbox của tôi chứa các thẻ html như

</br>Phone: </br> 814-888-9999 </br> Email: </br> [email protected] 

Khi tôi đi để xây dựng nó nó nó mang lại cho tôi một lỗi mà nói

Một giá trị Request.Form nguy hiểm đã được phát hiện từ khách hàng (QuestionAnswer="...ics Phone:<br/>814-888-9999<br...").

Tôi đã thử yêu cầu xác thực = "sai" nhưng nó không hoạt động.

Im xin lỗi tôi đã không thêm mã html của tôi để bạn xem xét cho đến thời điểm này. Tôi kéo một số câu hỏi lên nơi tôi có thể chỉnh sửa nó, nếu cần thiết.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> 


<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
EditFreqQuestionsUser 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $("#freqQuestionsUserUpdateButton").click(function() { 
     $("#updateFreqQuestionsUser").submit(); 
    }); 
}); 
</script> 
<h2>Edit Freq Questions User </h2> 

<%Administrator.AdminProductionServices.FreqQuestionsUser freqQuestionsUser = ViewBag.freqQuestionsUser != null ? ViewBag.freqQuestionsUser : new Administrator.AdminProductionServices.FreqQuestionsUser(); %> 
<%List<string> UserRoleList = Session["UserRoles"] != null ? (List<string>)Session["UserRoles"] : new List<string>(); %> 
<form id="updateFreqQuestionsUser" action="<%=Url.Action("SaveFreqQuestionsUser","Prod")%>" method="post" onsubmit+> 
<table> 
    <tr> 
     <td colspan="3" class="tableHeader">Freq Questions User Details <input type ="hidden" value="<%=freqQuestionsUser.freqQuestionsUserId%>" name="freqQuestionsUserId"/> </td> 
    </tr> 
    <tr> 
     <td colspan="2" class="label">Question Description:</td> 
     <td class="content"> 
      <input type="text" maxlength="2000" name="QuestionDescription" value=" <%=freqQuestionsUser.questionDescription%>" /> 
     </td> 
    </tr> 
    <tr> 
     <td colspan="2" class="label">QuestionAnswer:</td> 
     <td class="content"> 
      <input type="text" maxlength="2000" name="QuestionAnswer" value="<%=freqQuestionsUser.questionAnswer%>" /> 
     </td> 
    </tr> 
    <tr> 
     <td colspan="3" class="tableFooter"> 
       <br /> 
       <a id="freqQuestionsUserUpdateButton" href="#" class="regularButton">Save</a> 
       <a href="javascript:history.back()" class="regularButton">Cancel</a> 
     </td> 
    </tr> 
    </table> 
     </form> 
</asp:Content> 

Trả lời

23

trước khi trang được đệ trình bạn cần phải html mã hóa giá trị của textbox, với window.escape (...)

Nếu bạn cần văn bản chưa được thoát ở phía máy chủ, hãy sử dụngPhương pháp.

mẫu rất nhanh:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="SO.WebForm1" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script> 
     function makeSafe() { 
      document.getElementById('TextBox1').value = window.escape(document.getElementById('TextBox1').value); 
     }; 

     function makeDangerous() { 
      document.getElementById('TextBox1').value = window.unescape(document.getElementById('TextBox1').value); 
     } 
    </script> 
</head> 
<body> 
    <form id="form1" runat="server" onsubmit="makeSafe();"> 
    <div> 
     <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine" Rows="10" ClientIDMode="Static"></asp:TextBox> 
    </div> 
    <asp:Button ID="Button1" runat="server" Text="Button" /> 
    </form> 


    <script> 
     makeDangerous(); 
    </script> 
</body> 
</html> 

Thực hiện các thay đổi mã của bạn:

<script type="text/javascript"> 
    $(document).ready(function() { 
     makeDangerous(); 
     $("#freqQuestionsUserUpdateButton").click(function() { 
      makeSafe(); 
      $("#updateFreqQuestionsUser").submit(); 
     }); 
    }); 

    // Adding an ID attribute to the inputs you want to validate is simplest 
    // Better would be to use document.getElementsByTagName and filter the array on NAME 
    // or use a JQUERY select.... 

    function makeSafe() { 
     document.getElementById('QuestionAnswer').value = window.escape(document.getElementById('QuestionAnswer').value); 
    }; 

    // In this case adding the HTML back to a textbox should be 'safe' 
    // You should be very wary though when you use it as actual HTML 
    // You MUST take steps to ensure the HTML is safe. 
    function makeDangerous() { 
     document.getElementById('QuestionAnswer').value = window.unescape(document.getElementById('QuestionAnswer').value); 
    } 
</script> 
+0

Tôi đã thêm html để hiển thị cho bạn những gì tôi đã có ban đầu – Yusuf

+0

Hoạt động Hoàn hảo cho tôi cảm ơn! – Krismorte

1

Sử dụng html trong hộp không phải là một thực hành tốt, có thể sử dụng linebreaks (Environment.NewLine) hoặc \ r \ n thay vì br? .NET Reference

Ví dụ (trong C#):

textBox1.Multiline = true; 
textBox1.Text = "test" + Environment.NewLine + "test2"; 
+0

Tôi có thể sử dụng trong hộp text// n hoặc/r? – Yusuf

+0

Tôi đặt \ n vào hộp văn bản không hoạt động. Nó cũng không cho tôi lỗi. nó vừa nhập \ n như vậy bây giờ nó giống như \ n814-888-9999 – Yusuf

+0

@Yusuf nếu loại hộp văn bản là đa dòng, nó có! Sử dụng text1.text = "test" + "\ r \ n" + "test2"; – XhkUnlimit

4

Trang trí hành động điều khiển của bạn với [ValidateInput] thuộc tính:

[ValidateInput(false)] 
[HttpPost] 
public ActionResult Foo(MyViewModel model) 
{ 
    ... 
} 
+10

-1: Mặc dù đây là câu trả lời hợp lệ nhưng đây không phải là câu trả lời hay.Tôi không nghĩ rằng nên khuyên người dùng nên vô hiệu hóa xác thực một cách mù quáng. Thay vào đó, họ nên xác định _why_ validation là không thành công và sau đó đưa ra một giải pháp không chỉ tắt một cơ chế bảo mật quan trọng. Các đề xuất như những đề xuất được cung cấp bởi [Ted Spence] (http://stackoverflow.com/a/11673224/56864) và [Adrian] (http://stackoverflow.com/a/11673254/56864) là một nơi tốt để bắt đầu. –

+0

@KevinBabcock, * cơ chế bảo mật quan trọng *? Tôi bật cười. Bạn có thể vui lòng giải thích những gì là rất nhiều quan trọng về xác nhận này? Ngoài ra, bạn chỉ vô hiệu hóa xác thực cho hành động cụ thể này. Trong ASP.NET MVC 3 bạn có thể đạt được ngay cả một logic tốt hơn bằng cách trang trí các thuộc tính mô hình khung nhìn của bạn với thuộc tính '[AllowHtml]'. Điểm của việc sử dụng javascript để thoát khỏi đầu vào của người dùng trước khi gửi là gì? –

+5

Nghiêm túc? Bạn đang tranh luận rằng xác thực đầu vào là buồn cười và không quan trọng? "Trung hòa không đúng" của đầu vào của người dùng là [được liệt kê trong 3 đầu tiên trong số 25 lỗ hổng bảo mật hàng đầu trong phần mềm hiện nay] (http://www.sans.org/top25-software-errors/). Bạn chỉ cần nói với anh chàng để vô hiệu hóa xác nhận đầu vào mà không có lời giải thích nào cả. Không giải thích, không thay thế, không có gì. –

0

tôi sẽ đề nghị sử dụng biên tập HTML của AjaxControlToolkit. Tôi đang thực hiện điều đó ngay bây giờ. Nếu bạn là hộp văn bản có nhiều dòng và đủ lớn để chứa HTML, thì tại sao bạn không chỉ sửa nó thành trình soạn thảo HTML. Người dùng của bạn cũng sẽ hạnh phúc hơn.

http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/HTMLEditor/HTMLEditor.aspx

3

JavaScript khách:

function codificarTags() { 
        document.getElementById('txtDescripcion').value = document.getElementById('txtDescripcion').value.replace(/</g,'&lt;').replace(/>/g,'&gt;'); 
      }; 

<form id="form1" runat="server" onsubmit="codificarTags();"> 

Server:

protected void Page_Load(object sender, EventArgs e) 
    { 
     txtDescripcion.Text = txtDescripcion.Text.Replace(@"&lt;", @"<").Replace(@"&gt;", @">"); 
Các vấn đề liên quan