确保用户不在代码中输入恶意html

时间:2013-05-28 13:59:10

标签: javascript html web

我正在使用textarea从用户那里获取输入并将其显示在屏幕上。我怎样才能确保他们输入类似

的内容
<h1>YAY, I hacked in</h1>

我只是按原样显示它,并且它不会显示为<h1>。必须有一个功能。救命? :D

2 个答案:

答案 0 :(得分:2)

正如我评论的那样,如果您要将该数据发送到服务器,则应使用各种 XML Parsers 中的一种,并剥离+验证输入。

但是,如果您需要在客户端上进行纯粹验证,我建议您使用document.implementation.createHTMLDocument,它会在堆栈上创建一个完全成熟的 DOM对象。然后,您可以在那里进行操作并return验证您的数据。

示例:

function validate( input ) {
    var doc   = document.implementation.createHTMLDocument( "validate" );

    doc.body.innerHTML = input;

    return [].map.call( doc.body.querySelectorAll( '*' ), function( node ) {
        return node.textContent;
    }).join('') || doc.body.textContent;
}

称之为

validate( "<script>EVIL!</script>" );

答案 1 :(得分:1)

您需要在服务器端解决此问题。如果您在表单提交时使用JavaScript进行过滤,则用户可以通过创建自己的页面,使用telnet,禁用JavaScript,使用Chrome / FF / IE控制台等来破坏过滤器。如果您在显示时过滤,则可以使用#39; t减轻了任何事情,你只是在页面上移动了突破点。

例如,在PHP中,如果您希望仅使用用户的格式转储原始字符,则可以使用:

print htmlentities($user_submitted_data, ENT_NOQUOTES, 'utf-8');

在.NET中:

someControl.innerHTML = Server.HtmlEncode(userSubmittedData);

如果您正在尝试清理内容客户端以进行即时/预览显示,那么这应该足够了:

out.innerHTML = user_data.replace(/</g, "&lt;").replace(/>/g, "&gt;");