有没有理由清理用户输入以防止他们自己跨站点脚本?

Wil*_*nes 7 xss

如果我的字段只会显示给输入它们的用户,是否有任何理由清除它们以防止跨站点脚本?

编辑:所以共识很清楚,它应该被消毒.我想要了解的是为什么?如果能够查看他们插入到站点中的脚本的唯一用户是用户自己,那么他唯一可以做的就是自己执行脚本,他可以在没有我的站点参与的情况下执行该脚本.这里的威胁载体是什么?

小智 5

理论上:不会。如果您确定只有他们会看到此页面,那么就让他们编写他们想要的任何脚本。

问题在于,他们可以通过多种方式让其他人查看该页面,而这些方式是您无法控制的。他们甚至可能在同事的计算机上打开该页面并让他们查看。无可否认,这是一个额外的攻击媒介。

示例:没有持久存储的pastebin;你发布,你得到结果,就是这样。可以插入一个脚本,不显眼地添加一个“捐赠”按钮来链接到您的 PayPal 帐户。把它放在足够多的人的电脑上,希望有人捐赠,...

我同意这不是最令人震惊和最现实的例子。然而,一旦你必须用“这是可能的,但听起来还不错”来捍卫与安全相关的决定,你就知道你已经跨越了一定的界限。

否则,我不同意“永远不要相信用户输入”之类的答案。如果没有上下文,这种说法毫无意义。重点是如何定义用户输入,这就是整个问题。从语义上讲,如何信任?从句法上来说?达到什么水平;只是尺寸?正确的 HTML?unicode 字符的子集?答案取决于具体情况。裸露的网络服务器“不信任用户输入”,但今天有很多网站遭到黑客攻击,因为“用户输入”的界限取决于您的观点。

底线:避免让任何人对你的产品产生任何影响,除非昏昏欲睡的非技术消费者清楚什么和谁。

这从一开始就排除了几乎所有的 JS 和 HTML。

PS:在我看来,OP首先提出这个问题值得赞扬。“不要信任你的用户”不是软件开发的黄金法则。这是一个糟糕的经验法则,因为它破坏性太大。它有损于定义产品与外界之间可接受的交互边界的微妙之处。这听起来像是一场头脑风暴的结束,但实际上它应该开始一场头脑风暴。

软件开发的核心是为应用程序创建清晰的界面。该接口内的所有内容都是实现,其外部的所有内容都是安全性。让一个程序做你想要它做的事情是如此令人着迷,人们很容易忘记让它不做任何其他事情。

将您尝试构建的应用程序想象成一张美丽的图片或照片。使用软件,您可以尝试近似该图像。您使用规格作为草图,所以已经在这里,您的规格越草率,您的草图就越模糊。不过,您理想的应用程序的轮廓非常薄!您尝试使用代码重新创建该图像。小心地填充草图的轮廓。从本质上讲,这很容易。使用宽画笔:草图是否模糊,这部分显然需要着色。在边缘,它变得更加微妙。这时您就会意识到您的草图并不完美。如果你走得太远,你的程序就会开始做你不希望它做的事情,其中​​一些可能会非常糟糕。

当您看到模糊的线条时,您可以做两件事:仔细观察您的理想图像并尝试完善您的草图,或者停止着色。如果你选择后者,你很可能不会走得太远。但你最多也只能对你的理想程序做出一个粗略的近似。无论如何,您仍然可能会意外越界!很简单,因为你不确定它在哪里。

我祝福你能更仔细地观察那条模糊的界限并尝试重新定义它。你越接近边缘,你就越确定它在哪里,你越过它的可能性就越小。

无论如何,在我看来,这个问题不是安全问题,而是设计问题:您的应用程序的边界是什么,以及您的实现如何反映它们?

如果答案是“永远不要相信用户输入”,那么你的草图就会模糊。

(如果你不同意:如果 OP 适用于“testxsshere.com”怎么办?繁荣!检查伙伴。)

(有人应该注册 testxsshere.com)