ホームページ  >  に質問  >  本文

javascript - <textarea> 怎么过滤 js 脚本

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

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

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

黄舟黄舟2773日前472

全員に返信(6)返信します

  • 迷茫

    迷茫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 给禁用了?具体请把代码贴上来。

    返事
    0
  • 黄舟

    黄舟2017-04-10 16:50:01

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

    返事
    0
  • ringa_lee

    ringa_lee2017-04-10 16:50:01

    全角字符……

    返事
    0
  • PHP中文网

    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标签。

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:50:01

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

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

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

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

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

    手机竟然也码了这么多字

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:50:01

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

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

    返事
    0
  • キャンセル返事