在我认知的范围内如果一个网页输入文本框使用了<textarea></textarea>的话在中间编辑
<script>
alert(1);
</script>
之类的东西提交以后再取出来页面上貌似会执行alert事件的呢,但是并没有那是为啥?
迷茫2017-04-10 16:50:01
抱歉,刚刚又看了一遍问题描述,发现题主的意思我没看懂,请问题主你到底是想问话说textarea怎么避免输入js脚本~
还是往 textarea 填了 js 内容输出后却没有执行 js 脚本
?
怎么避免输入js脚本
:输出的时候对文本框的内容进行转义,如果你用的是 PHP,可以看一下htmlspecialchars()
:
http://php.net/manual/zh/function.htmlspecialchars.php
P.S.如果你是要 textarea 的东西存进数据库的话也可以在存数据库之前就对它进行转义,但我个人推荐输出时转义,因为你不能确定(当然如果你可以确定的话那就可以不用看这一句了)这个数据在输出之前是否还需要进行其他的操作/运算,所以我认为在存数据库的时候要保持数据是原始的。
往 textarea 填了 js 内容输出后却没有执行 js 脚本
:这个可能是进行了“题主不知道”转义,例如题主是不是用了什么自动过滤 XSS 的框架?又或者是题主把浏览器的 JS 给禁用了?具体请把代码贴上来。
黄舟2017-04-10 16:50:01
那是因为再textarea中的所有<>&“‘都被转义了,也就是在html中<使用<代替等,但是浏览器认知它将其显示为
<,
也就是你看到的时<script>
,浏览器看到是<script>
自然就不执行
PHP中文网2017-04-10 16:50:01
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标签。
大家讲道理2017-04-10 16:50:01
楼主是要防止XSS攻击,其实有两种方式避开这种攻击
1.在客户端浏览器提交进来的时候就把提交数据该过滤过滤,该替换替换,随后入库
2.客户端浏览器提交上来什么也不做,但是在输出的时候该过滤过滤该输出输出
但大家绝大多数会采取第一种
顺嘴提一句:不光textarea要防类似这种javascript攻击,任何由客户端浏览器的都要过滤。
1.像楼上提出的htmlspecialchars可以做到这一点,但一定要注意指定第二个参数。当然htmlspecialchars也不是万能的,这点要注意。
2.建议使用htmlpurity这个库,经历过历史的绝对考验,对于过滤输入强有力!墙裂推荐学习里面的常用用法!
手机竟然也码了这么多字
大家讲道理2017-04-10 16:50:01
textarea里的内容在浏览器里会自动编码成实体字符<textarea><script>alert(1)</script></textarea>
需要先跳出textarea标签</textarea><script>alert(1);</script>