1

信息

这是一个关于在我的网站中查找可能的 XSS 攻击的快速问题。

我目前正在保护我的网站,并且了解到防止 XSS 的一个好方法是使用htmlspecialchars($string, ENT_QUOTES, 'UTF-8');确保显示而不是运行 html。

我的解决方案

我已经用测试数据抽取了我的数据库,如下所示<script>console.log("This Page is Vulnerable");</script>

因此,任何显示任何未转义的数据行的页面都会输出一个 console.log,然后我可以在我的源中找到它并转义它。

问题

现在我明白这不是我唯一需要做的事情来防止 XSS,但这是否至少缩小了持续 XSS 攻击的可能性?

最后,有人对从这里去哪里有任何建议吗?(我知道这是一个模糊的问题,所以如果你喜欢请忽略。否则,任何问题都会尽快回答。)

谢谢你。

4

2 回答 2

1

是的,当然,包装输入/输出数据的单个函数是远远不够的。编程不是魔术,而是逻辑。

假设你有这个例子 HTML/JS/PHP 出于某种原因:

<form action="" method="POST" />
<input type="text" name="yourInput" />
<input type="submit"/>
</form>
<script><?= htmlspecialchars($_POST['yourInput'], ENT_QUOTES, 'UTF-8');?></script>

出于某种可能没人能解释的原因,您将用户输入放入<script>标签中。您使用了 HTML 特殊字符,因此不会出现引号或<,,>但假设用户输入以下内容:

alert(document.cookie)

没有引号和开始标签,但在提交表单后,下次加载时将显示带有当前用户 cookie 的 ALERT。

因此,正如我在评论中所说,您应该检查所有输入并测试它们的行为。试着把自己想象成一个潜在的黑客。

这不仅仅是使用包装数据的函数,而是使用数据的位置。如果你把它放在错误的地方,没有任何功能可以拯救你。在上面的示例中,您需要将数据放在正确的位置,如果您要使用它 - 将其用作字符串。

于 2013-10-24T12:08:33.463 回答
0

我想说这正是你所说的——“一个好的开始”——只要它可以捕捉到任何简单的错误,你只是想逃避用户输入但忘记了。

事实上,我倾向于进一步简化它,只是尝试注入一个应该被转义的任意字符串,比如说“ <<<<<”,然后在返回页面的HTML 源中搜索该字符串以查看它是否在任何地方都未转义. (不要忘记用单引号和双引号对其进行测试,因为它们也需要在属性中进行转义。)这种测试甚至可以相当简单地自动化。

这些方法都不会捕捉到您尝试转义或清理输入但做得很差的情况,因此简单的测试输入不会通过,但其他漏洞仍然存在。但是,如果您可以确信自己没有这样做,那么这些简单的测试就足够了。

无论如何,IMO 应该从这里开始养成编写代码的习惯,这样 XSS 漏洞甚至都不会发生。尤其要习惯:

  1. 在将不应该是 HTML 的每个字符串嵌入 HTML 之前,将其转义。(当然,在进行必要的修改后,将任何不应该是 SQL 的内容嵌入到 SQL 代码中,或者将任何不应该是 JavaScript 的内容嵌入到 JavaScript 代码中,等等也是如此。)htmlspecialchars()

    这是 IMO 最好在字符串打印或与 HTML 连接之前完成,这样您就不必担心字符串是否已经被转义了。(提示:如果您厌倦了一直打字htmlspecialchars(),请考虑为其定义自己的较短别名。)

  2. 考虑用户输入(或任何其他可能来自未知来源的内容),而不是根据它们应该包含的内容,甚至攻击者可能注入的内容,而只是根据它们可能包含的内容

    也就是说,如果您的代码将字符串作为输入,则编写它以使其行为正确,即使给定包含任意顺序的任意字节的任意长度的任意字符串。

    相反,如果您不能确定某些代码会这样做(例如,因为您没有编写它),请显式验证和/或强制您传递给它的任何输入只有您知道它可以处理的值。

于 2013-10-24T15:08:47.287 回答