<textarea> 怎么过滤 js 脚本

SethRoutine
  • 76

在我认知的范围内如果一个网页输入文本框使用了<textarea></textarea>的话在中间编辑

<script>
    alert(1);
</script>

之类的东西提交以后再取出来页面上貌似会执行alert事件的呢,但是并没有那是为啥?

回复
阅读 6.8k
7 个回答

抱歉,刚刚又看了一遍问题描述,发现题主的意思我没看懂,请问题主你到底是想问话说textarea怎么避免输入js脚本~还是往 textarea 填了 js 内容输出后却没有执行 js 脚本


对于怎么避免输入js脚本

输出的时候对文本框的内容进行转义,如果你用的是 PHP,可以看一下htmlspecialchars()
http://php.net/manual/zh/function.htmlspecialchars.php

P.S.如果你是要 textarea 的东西存进数据库的话也可以在存数据库之前就对它进行转义,但我个人推荐输出时转义,因为你不能确定(当然如果你可以确定的话那就可以不用看这一句了)这个数据在输出之前是否还需要进行其他的操作/运算,所以我认为在存数据库的时候要保持数据是原始的。


对于往 textarea 填了 js 内容输出后却没有执行 js 脚本

这个可能是进行了“题主不知道”转义,例如题主是不是用了什么自动过滤 XSS 的框架?又或者是题主把浏览器的 JS 给禁用了?具体请把代码贴上来。

那是因为再textarea中的所有<>&“‘都被转义了,也就是在html中<使用<代替等,但是浏览器认知它将其显示为
<,
也就是你看到的时<script>,浏览器看到是&lt;script&gt; 自然就不执行

全角字符……

W3C标准中对于<textarea>是这样定义的:
http://www.w3.org/TR/html-markup/textarea.html#textarea-content-model

也就是说,<textarea>标签中只允许replaceable character data

这是个什么东西呢,可以看这里:
http://www.w3.org/TR/html-markup/syntax.html#replaceable-character-data

must not contain any occurrences of the string "</" followed by characters that are a case-insensitive match for the tag name of the element containing the replaceable character data (for example, "</title" or "</textarea"), followed by a space character, ">", or "/".

所以,只要内容里面没有</textarea>这样的内容,那么所有的字符都会按照字符来显示,不会被解释为HTML标签。

楼主是要防止XSS攻击,其实有两种方式避开这种攻击
1.在客户端浏览器提交进来的时候就把提交数据该过滤过滤,该替换替换,随后入库
2.客户端浏览器提交上来什么也不做,但是在输出的时候该过滤过滤该输出输出

但大家绝大多数会采取第一种

顺嘴提一句:不光textarea要防类似这种javascript攻击,任何由客户端浏览器的都要过滤。

1.像楼上提出的htmlspecialchars可以做到这一点,但一定要注意指定第二个参数。当然htmlspecialchars也不是万能的,这点要注意。

2.建议使用htmlpurity这个库,经历过历史的绝对考验,对于过滤输入强有力!墙裂推荐学习里面的常用用法!

手机竟然也码了这么多字?

textarea里的内容在浏览器里会自动编码成实体字符
<textarea>&lt;script&gt;alert(1)&lt;/script&gt;</textarea>

需要先跳出textarea标签
</textarea><script>alert(1);</script>

你知道吗?

宣传栏