从客户端检测到潜在的危险Request.Form值


1470

每次用户在Web应用程序中的页面中包含内容<>在页面中发布内容时,都会引发此异常。

我不想讨论引发异常或崩溃整个Web应用程序的明智性,因为有人在文本框中输入了字符,但是我正在寻找一种优雅的方式来解决这个问题。

捕获异常并显示

发生错误,请返回并重新输入整个表格,但是这次请不要使用<

在我看来还不够专业。

禁用后验证(validateRequest="false")肯定会避免此错误,但是它将使页面容易受到多种攻击。

理想情况下:当发生包含HTML受限字符的回发时,Form集合中的已发帐值将自动进行HTML编码。所以.Text我的文本框的属性将是something & lt; html & gt;

有没有办法可以从处理程序做到这一点?


68
请注意,如果输入中也包含HTML实体名称(&amp;)或实体编号(&#39;),则可能会出现此错误。
德鲁·诺阿克斯

18
好吧,由于这是我的问题,我觉得我可以定义真正的意思是:由于有人键入“ <”而使整个应用程序崩溃,并返回通用错误消息是过大的。尤其是因为您知道大多数人都只会'validateRequest = false'来摆脱它,从而重新打开漏洞
Radu094 2014年

7
@DrewNoakes:根据我的测试(在.Net 4.0中测试),实体名称(&amp;)似乎不是问题,尽管实体编号(&#39;)确实无法通过验证(如您所说)。如果使用.Net Reflector分解System.Web.CrossSiteScriptingValidation.IsDangerousString方法,则会看到该代码专门用于html标签(以<开头)和实体编号(以&#开头)
Gyum Fox 2015年

5
使用默认的MVC项目在VS2014中创建一个新站点并运行它。单击注册链接,添加任何电子邮件,然后使用“ <P455-0r [!” 作为密码。开箱即用的相同错误,不尝试做任何恶意的事情,不会显示密码字段,因此它不会是XSS攻击,但是解决此问题的唯一方法是使用ValidateInput(false)完全删除验证?在这种情况下,AllowHtml建议不起作用,但仍然出现相同的错误。从客户端检测到一个潜在危险的Request.Form值(密码=“ <P455-0r [!”)。
stephenbayer

TL; DR放在<httpRuntime requestValidationMode="2.0" />web.config中

Answers:


1080

我认为您通过尝试对所有发布的数据进行编码而从错误的角度进行了攻击。

请注意,< ”也可能来自其他外部来源,例如数据库字段,配置,文件,提要等。

此外,“< ”并不是天生的危险。这仅在特定情况下是危险的:在编写尚未编码为HTML输出的字符串时(由于XSS)。

在其他情况下,不同的子字符串很危险,例如,如果您将用户提供的URL写入链接,则子字符串“ javascript:”可能很危险。另一方面,在SQL查询中插入字符串时,单引号字符很危险,但如果它是从表单提交的名称或从数据库字段读取的名称的一部分,则单引号是完全安全的。

最重要的是:您不能过滤危险字符的随机输入,因为在适当的情况下任何字符都可能是危险的。您应该在某些特定字符可能会变得危险的地方进行编码,因为它们会跨入具有特殊含义的不同子语言。在将字符串写入HTML时,应使用Server.HtmlEncode对在HTML中具有特殊含义的字符进行编码。如果将字符串传递给动态SQL语句,则应该对不同的字符进行编码(或者更好的方法是,让框架通过使用准备好的语句等为您完成此操作)。

确定在所有地方都进行HTML编码时,您可以将字符串传递给HTML,然后在文件validateRequest="false"中的<%@ Page ... %>伪指令中进行设置.aspx

在.NET 4中,您可能需要做更多的事情。有时有必要还添加<httpRuntime requestValidationMode="2.0" />到web.config(参考)。


74
对于迟到的用户:Page指令(.aspx文件的第一行)中包含validateRequest =“ false”
MGOwen,2010年

56
提示:放置<httpRuntime requestValidationMode="2.0" />一个位置标记,以避免杀死其余站点所提供的有用的保护。
布莱恩(Brian)

297
在MVC3中,这位于[AllowHtml]模型属性上。
Jeremy Holovacs 2011年

2
要在MVC 3中全局禁用它,您还需要GlobalFilters.Filters.Add(new ValidateInputAttribute(false));输入Application_Start()
Alex

15
@MGOwen您还可以通过<pages validateRequest="false" />in 将page指令添加到web.config 中<system.web />。这样做会将属性应用于所有页面。
Oliver-clare

504

如果您使用的是ASP.NET MVC,则有针对此错误的另一种解决方案:

C#示例:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Visual Basic示例:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function

问题可能会在需要整个应用程序的一页时出现

3
您也可以在类级别添加[ValidateInput(false)]属性。如果将其添加到基本控制器类中,它将应用于所有控制器方法操作。
Shan Plourde

@Zack感谢您的解决方案。另一方面,我想知道是否[AllowHtml]比更好ValidateInput(false),因为它[AllowHtml]是为属性(即“编辑器”字段)立即定义的,并且无论何时使用它,都无需将其用于多个操作。你有什么建议?
2015年

@Zack Peterson使用安全吗?没有安全问题?
shrey Pav

416

在ASP.NET MVC(从版本3开始)中,您可以添加 AllowHtml属性到模型的属性中。

通过跳过属性的请求验证,它允许请求在模型绑定期间包括HTML标记。

[AllowHtml]
public string Description { get; set; }

12
声明性地比在控制器中更好地做到这一点!
2012年

29
唯一正确的答案!禁用对控制器操作的验证是很棘手的。为了禁用应用程序级别的验证,必须将开发人员绞死!
Trailmax 2014年

这在MVC 4中消失了吗?
granadaCoder

1
ValidateInput(false)和之间有什么区别AllowHtml?一个相对于另一个的优势是什么?我什么时候要使用AllowHtml代替ValidateInput(false)?我什么时候要ValidateInput(false)用完AllowHtml?我什么时候要同时使用两者?两者都使用有意义吗?
伊恩·博伊德

3
ValidateInput是方法,AllowHtml是在模型的属性-所以你只允许一个你期望有HTML -不是所有
安东尼约翰斯顿

213

如果您使用的是.NET 4.0,请确保将其添加到标签内的web.config文件中<system.web>

<httpRuntime requestValidationMode="2.0" />

在.NET 2.0中,请求验证仅适用于aspx请求。在.NET 4.0中,它已扩展为包括所有请求。通过指定以下内容,可以还原为在执行处理时执行XSS验证.aspx

requestValidationMode="2.0"

您可以通过指定完全禁用请求验证:

validateRequest="false"

30
<system.web>标签内。
Hosam Aly

8
我已将其放在web.config中,但仍出现错误“潜在危险的Request.Form值”
Filip 2010年

20
看起来<httpRuntime requestValidationMode =“ 2.0” />仅在计算机上安装了2.0框架时才有效。如果根本不安装2.0框架而仅安装4.0框架怎么办?
塞缪尔

这完全为我工作。其他答案中没有任何步骤文档是必需的(包括validateRequest =“ false”)!
汤姆·雷德芬

112

对于ASP.NET 4.0,可以将标记全部放入一个<location>元素中,从而允许将标记作为特定页面而不是整个站点的输入。这将确保您所有其他页面都是安全的。您无需放入ValidateRequest="false".aspx页。

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

在web.config中进行控制比较安全,因为您可以在站点级别看到哪些页面允许标记作为输入。

您仍然需要以编程方式验证禁用请求验证的页面上的输入。


:4在这里|上requestValidationMode = 2更多信息msdn.microsoft.com/en-us/library/...
GlennG

遗憾的是,这不能与ASP.net 2.0一起使用。删除httpRuntime行,它将起作用。
Fandango68年

我添加了一条警告,提醒人们在禁用验证时手动验证输入。
卡特·梅德林2015年

72

先前的答案很棒,但是没有人说过如何排除单个字段以进行HTML / JavaScript注入验证。我不知道以前的版本,但是在MVC3 Beta中,您可以执行以下操作:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

这仍然会验证除排除字段以外的所有字段。这样做的好处是,您的验证属性仍会验证该字段,但是您不会收到“从客户端检测到潜在的Request.Form值危险”异常。

我用它来验证正则表达式。我已经创建了自己的ValidationAttribute来查看正则表达式是否有效。由于正则表达式可以包含类似于脚本的内容,因此我应用了上面的代码-正则表达式是否有效仍在检查中,但如果包含脚本或HTML,则不会进行检查。


10
可悲的是,似乎排除功能已从MVC 3 RTW中删除:(
Matt Greer

2
它也未包含在MVC 4中
wilsjd 2013年

9
[AllowHtml]在模型的属性上使用,而不是[ValidateInput]在Action上使用,以实现相同的最终结果。
Mrchief

2
@Christof请注意,我的回答是5岁。我已经很长时间没有遇到这个问题了,因此可能会有很多更好的方法来处理它。关于这两个选项,我认为这取决于您的情况。也许您在多个动作中公开了该模型,并且在某些地方允许或不允许HTML。在这种情况下,[AllowHtml]这不是一个选择。我建议您查看这篇文章:weblogs.asp.net/imranbaloch/…,但是它也有些旧,可能已经过时了。
gligoran

1
仍然有一种方法可以从验证中排除特定的方法参数,请在此处查看我的答案:stackoverflow.com/a/50796666/56621
Alex

51

在ASP.NET MVC中,您需要在web.config中设置requestValidationMode =“ 2.0”和validateRequest =“ false”,并将ValidateInput属性应用于控制器操作:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}

2
对我来说,validateRequest="false"没有必要,只是requestValidationMode="2.0"
汤姆·雷德芬

requestValidationMode =“ 2.0”仍会使用HTML编码数据生成错误。除了base64编码之外,没有其他解决方案,然后将其发送出去。
MC9000


43

对于MVC,请通过添加忽略输入验证

[ValidateInput(false)]

在控制器中每个动作上方。


如果它通过已配置的路由到达controller方法,这似乎不起作用。
PandaWood '16

事实上,技术的解释是,当有问题的角色是在“查询字符串”这只是工作......如果这是在请求路径,验证属性工作
PandaWood

42

您可以在Global.asax中捕获该错误。我仍然想验证,但显示适当的消息。在下面列出的博客上,可以找到类似的示例。

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

重定向到另一个页面似乎也是对异常的合理响应。

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html


40

这个问题的答案很简单:

var varname = Request.Unvalidated["parameter_name"];

这将禁用特定请求的验证。


1
仅适用于ASP.NET 4.5(并且可能适用于它之后的任何内容。)Pre 4.5不支持此功能。
Beska 2014年

3
我希望我可以这样提高。我正在使用.NET 4.5,这正是我所需要的,因为我没有使用MVC,并且无法更改web.config。
克里斯·吉伦

1
是的,但是如果您使用的是.Net 2,该怎么办?我们中有些人别无选择
Fandango68年

这得到POST或GET参数?
max4ever 2015年

您是说这可以防止已经引发的异常吗?还是.net 4.5将延迟和验证延迟到实际从读取数据之前Request
ebyrob

34

请记住,某些.NET控件将自动对输出进行HTML编码。例如,在TextBox控件上设置.Text属性将自动对其进行编码。这具体地是指变换<&lt;>&gt;&&amp;。所以要小心做...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

但是,HyperLink,Literal和Label的.Text属性不会对内容进行HTML编码,因此请包装Server.HtmlEncode();。如果要防止<script> window.location = "http://www.google.com"; </script>将其输出到页面中并随后执行,则必须在这些属性上进行任何设置。

做一些实验,看看什么被编码,什么没被编码。


29

在web.config文件的标记中,插入带有属性requestValidationMode =“ 2.0”的httpRuntime元素。还要在pages元素中添加validateRequest =“ false”属性。

例:

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>

1
对我来说,不需要validateRequest =“ false”,只有requestValidationMode =“ 2.0”
tom redfern 2012年

3
“页面”部分必须位于“ system.web”部分中。
卡特·梅德林

危险的答案,再次。
MC9000

我都需要 谢谢
杰克

23

如果您不想禁用ValidateRequest,则需要实现JavaScript函数,以避免发生异常。这不是最佳选择,但它可以工作。

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

然后在后面的代码中,在PageLoad事件上,使用下一个代码将属性添加到控件中:

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")

4
这仍然会使应用容易受到虚假的POST请求的攻击。普通用户在输入如,:或引号之类的字符时会遇到问题,但是普通黑客在将格式错误的数据发布到服务器时不会有问题。我会把这话告诉我。
Radu094

13
@ Radu094:此解决方案使您可以保持ValidateRequest = true,这意味着黑客仍然会碰壁。投票,因为与关闭ValidateRequest相比,它使您不那么容易受到攻击。
jbehren 2011年

21

似乎还没有人提及以下内容,但是它为我解决了这个问题。在有人说是的之前,这是Visual Basic ...糟糕。

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>

我不知道是否有任何缺点,但是对我来说,这很了不起。


适用于c#或VB网络表单的作品
TheAlbear 2014年

19

另一个解决方案是:

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}

真好!不知道可以替换请求验证器。我不再像您那样说“ ok”,而是扩展了这种想法,以不验证以“ _NoValidation”结尾的字段作为其名称。下面的代码。
Walden Leverich

Walden Leverich,要执行此操作,请参阅[AllowHtml]属性
Sel

Sel,是的,在可以使用的MVC环境中。但是在Webforms应用程序中,我没有模型可以做到这一点。:-)
Walden Leverich

15

如果您使用的是Framework 4.0,则web.config中的条目(<pages validateRequest =“ false” />)

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

如果您使用的是框架4.5,则web.config中的条目(requestValidationMode =“ 2.0”)

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>

如果只需要一页,则在aspx文件中,应将第一行如下:

<%@ Page EnableEventValidation="false" %>

如果您已经有了<%@ Page之类的东西,那么只需添加其余的=> EnableEventValidation="false"%>

我建议不要这样做。


13

在ASP.NET中,您可以捕获异常并对其进行处理,例如显示友好的消息或重定向到另一页面...还有可能您可以自己处理验证...

显示友好的消息:

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}

13

我想您可以在一个模块中完成;但这留下了一些问题;如果要将输入保存到数据库怎么办?突然因为将编码数据保存到数据库中,您最终信任了来自数据库的输入,这可能不是一个好主意。理想情况下,您将未编码的原始数据存储在数据库中,并且每次都进行编码。

更好的选择是在每页级别禁用保护,然后每次编码。

而不是使用Server.HtmlEncode,您应该查看Microsoft ACE团队提供的更新,更完整的Anti-XSS库


12

原因

默认情况下,ASP.NET会验证所有输入控件中是否存在潜在的不安全内容,这些内容可能导致跨站点脚本(XSS)和SQL注入。因此,通过抛出以上异常,它不允许此类内容。默认情况下,建议允许在每次回发中进行此检查。

在许多情况下,您需要通过Rich TextBoxes或Rich Text Editors向页面提交HTML内容。在这种情况下,可以通过将@Page伪指令中的ValidateRequest标记设置为false 来避免此异常。

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

这将禁用对将ValidateRequest标志设置为false的页面的请求的验证。如果要禁用此功能,请检查整个Web应用程序。您需要在web.config <system.web>部分中将其设置为false

<pages validateRequest ="false" />

对于.NET 4.0或更高版本的框架,您还需要在<system.web>部分中添加以下行以使上述工作有效。

<httpRuntime requestValidationMode = "2.0" />

而已。我希望这可以帮助您摆脱上述问题。

参考:ASP.Net错误:从客户端检测到潜在危险的Request.Form值


10

我找到了一种使用JavaScript编码数据的解决方案,该数据在.NET中解码(并且不需要jQuery)。

  • 使文本框成为HTML元素(例如textarea),而不是ASP。
  • 添加一个隐藏的字段。
  • 将以下JavaScript函数添加到标题中。

    函数boo(){ta​​rgetText = document.getElementById(“ HiddenField1”); sourceText = document.getElementById(“ userbox”); targetText.value = escape(sourceText.innerText); }

在您的文本区域中,包含一个调用boo()的onchange:

<textarea id="userbox"  onchange="boo();"></textarea>

最后,在.NET中,使用

string val = Server.UrlDecode(HiddenField1.Value);

我知道这是一种方法-如果需要两种方法,则必须发挥创意,但是如果您无法编辑web.config,则可以提供解决方案。

这是我(MC9000)通过jQuery提出并使用的示例:

$(document).ready(function () {

    $("#txtHTML").change(function () {
        var currentText = $("#txtHTML").text();
        currentText = escape(currentText); // Escapes the HTML including quotations, etc
        $("#hidHTML").val(currentText); // Set the hidden field
    });

    // Intercept the postback
    $("#btnMyPostbackButton").click(function () {
        $("#txtHTML").val(""); // Clear the textarea before POSTing
                               // If you don't clear it, it will give you
                               // the error due to the HTML in the textarea.
        return true; // Post back
    });


});

和标记:

<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />

这很好。如果黑客尝试绕过JavaScript发布,他们只会看到错误。您也可以将所有编码后的数据保存在数据库中,然后取消转义(在服务器端),并在显示其他位置之前解析并检查攻击。


这是一个很好的解决方案。这是一种手动控制它并且不使整个网站或页面无效的正确手动方法
Fandango68 2015年

确保对文本区域使用HTML标记,而不是ASP.Net控件(即,没有runat =“ server”),然后对隐藏项使用ASP.Net隐藏控件。这是我见过的不折不扣的最佳解决方案。自然,您想在服务器端解析XSS和SQL注入的数据,但至少可以发布HTML
MC9000,2015年

escape(...)可能需要很长时间。就我而言,标记是一个完整的(2MB)XML文件。您可能会问:“为什么不使用<input type="file"...,...我同意您的意见:)
红豌豆

10

这里的其他解决方案也不错,但是必须对每个Model属性都应用[AllowHtml],这在后面有些麻烦,尤其是当您在一个大小合适的站点上拥有100多个模型时,尤其如此。

如果像我一样,您想要在整个站点范围内禁用此功能(恕我直言,我一点也没意义),则可以在基本控制器中覆盖Execute()方法(如果您还没有基本控制器,我建议您制作一个,则可以对于应用通用功能非常有用)。

    protected override void Execute(RequestContext requestContext)
    {
        // Disable requestion validation (security) across the whole site
        ValidateRequest = false;
        base.Execute(requestContext);
    }

只需确保对所有输入到用户视图的视图进行HTML编码(无论如何,它都是使用Razor在ASP.NET MVC 3中的默认行为,因此,除非出于某些奇怪的原因,您正在使用Html.Raw()您不需要此功能。


9

我也收到此错误。

就我而言,用户á在“角色名称”(关于ASP.NET成员资格提供程序)中输入了带重音符号的字符。

我将角色名称传递给向用户授予该角色的方法,而$.ajax发布请求失败了……

我这样做是为了解决问题:

代替

data: { roleName: '@Model.RoleName', users: users }

做这个

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw 做到了。

我正在将角色名称作为HTML值roleName="Cadastro b&#225;s"。HTML实体的此值&#225;已被ASP.NET MVC阻止。现在,我以应有的roleName方式获取参数值:roleName="Cadastro Básico"并且ASP.NET MVC引擎将不再阻止请求。



7

您还可以使用JavaScript的escape(string)函数替换特殊字符。然后服务器端使用Server。URLDecode(字符串)将其切换回去。

这样,您不必关闭输入验证,对于其他程序员来说,该字符串可能具有HTML内容将更加清楚。


7

我最终在每次回发之前都使用JavaScript来检查不需要的字符,例如:

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == 'text') {
            if (tbs(i).value.indexOf('<') != -1 || tbs(i).value.indexOf('>') != -1) {
                alert('<> symbols not allowed.');
                isValid = false;
            }
        }
    }
    return isValid;
}

当然,我的页面主要是数据输入,很少有元素可以进行回发,但是至少保留了它们的数据。


应该有大括号而不是小括号。像`if(tbs [i] .type =='text'){`代替`if(tbs(i).type =='text'){`
Shilpa Soni 2014年


4

只要这些仅是 “ <”和“>”(而不是双引号本身)字符,并且您在诸如<input value =“ this ” />之类的上下文中使用它们,就可以安全使用(而对于<textarea > 这个 </ textarea>当然很容易受到攻击。这样可以简化您的情况,但对于其他任何用途,请使用其他已发布的解决方案之一。


4

如果您只是想告诉用户<和>不能使用,但您不希望整个表单事先处理/发回(并丢失所有输入),您是否不能简单地将验证程序来筛选那些(可能还有其他潜在危险)字符?


帖子说“验证者”请
mxmissile

4

没有任何建议对我有用。我不想关闭整个网站的此功能,因为99%的时间我都不希望我的用户在Web表单上放置HTML。我只是围绕方法创建了自己的工作,因为我是唯一使用此特定应用程序的方法。我在后面的代码中将输入转换为HTML,然后将其插入数据库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.