你可能有一个脚本在HTML文本区/文本字段,并有它执行

Could you possibly have a script in an HTML textarea/textfield and have it executed?

本文关键字:字段 文本 执行 文本区 有一个 脚本 HTML      更新时间:2023-09-26

有人提出一个观点,认为文本区接受太多字符可能会有风险,因为人们可能会在里面放脚本。

在我的一生中,我从未听说过那种可能性。有没有人能透露一些光,是否有可能有一个脚本在文本表单字段,并以某种方式有它执行?

是的-这就是XSS的工作原理。非常简单—您可以将脚本内容添加到dom并以这种方式执行它。例如,这会触发一个警告:

$('#myDiv').html('<script type="text/javascript">alert("hello world");</script>');

这里是一个提琴

任何时候处理use输入,都有XSS漏洞的风险。

假设你有一个简单的HTML表单,像这样:

<form action="submit.php" method="post">
<textarea name="insecuretext"></textarea>
</form>

然后在你的服务器上你有这样的内容:

<div class="usercontent">
<?php echo $_POST["insecuretext"]; ?>
</div>

对于99%的用户来说,这将完美地工作,但如果有人提交了这个呢?

<script>somethingEvil();</script>

你的HTML看起来像这样:

<div class="usercontent">
<script>somethingEvil();</script>
</div>

然后任何看那个页面的人都会受到JavaScript的影响。

一个非常简单的解决方案是通过调用strip_tags()

来净化您的输入
<div class="usercontent">
<?php echo strip_tags($_POST["insecuretext"]); ?>
</div>

现在,除非您的攻击者非常聪明,否则在这种情况下您不会受到XSS的攻击。

另一种常见的情况是将不安全的内容作为元素的属性。我在一个论坛上看到了一个这样的例子,开发人员出于某种原因将帖子的内容放在data-content属性中。

<div class="forum_post" data-content="<?php echo $_POST["insecuretext"]; ?>"></div>
我可以通过提交这样的内容来打破这个规则:
foo" onload="somethingEvil();"> <!-- 

打印为<div class="forum_post" data-content="foo" onload="somethingEvil();"> <!-- ></div>

在本例中,所需要做的就是将我的特殊字符转换为实体:

<div class="forum_post" data-content="<?php echo htmlentities($_POST["insecuretext"]); ?>"></div>

就像这样:

<div class="forum_post" data-content="foo&quot; onload=&quot;somethingEvil();&quot;&gt; &lt;!-- "></div>

所以你应该从这里得到什么:

  • 在任何情况下都不要相信你的用户
  • 绝不打印未经消毒或未经验证的用户输入
  • 了解XSS技术以及如何阻止它们
  • 知道什么时候你可能容易受到攻击,如果攻击者通过你的防御,你会怎么做
  • 理解长度与安全无关。除非你将输入限制为3个字符,否则可能会有潜在的危险。