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

时间:2010-03-03 23:21:28

标签: xss

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

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

5 个答案:

答案 0 :(得分:4)

理论上:不。如果您确定只有他们会看到这个页面,那么让他们编写他们想要的任何内容。

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

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

我同意这不是最令人震惊和现实的例子。但是,一旦你必须用“那是可能的,但它不会发出坏”来保护与安全相关的决定,你知道你越过了某条线。

否则,我不同意“永不信任用户输入”之类的答案。没有背景,这种说法毫无意义。关键是如何定义用户输入,这是整个问题。从语义上如何信任?在语法?达到什么水平;只是尺寸?适当的HTML? unicode字符的子集?答案取决于具体情况。裸网络服务器“不信任用户输入”,但今天有很多网站被黑客入侵,因为“用户输入”的界限取决于您的观点。

底线:避免让任何人对您的产品产生任何影响,除非困倦的非技术消费者明白什么和谁。

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

P.S。:在我看来,OP首先要问这个问题值得赞扬。 “不要相信你的用户”不是软件开发的黄金法则。这是一个不好的经验法则,因为它太具有破坏性;它在定义产品与外部世界之间可接受的相互作用的前沿方面有所瑕疵。这听起来像是头脑风暴的结束,而它应该从头开始。

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

将您尝试构建的应用程序想象为精美的照片或照片。使用软件,您尝试近似该图像。您使用规格作为草图,因此在此处,您的规格越粗糙,草图就越模糊。不过,你理想的应用程序的轮廓很薄!您尝试使用代码重新创建该图像。小心地填写草图的轮廓。核心,这很容易。使用宽刷:模糊的草图与否,这部分显然需要着色。在边缘,它变得更加微妙。这是当你意识到你的草图不完美时。如果你走得太远,你的程序会开始做你不想要的事情,其中​​一些可能非常糟糕。

当您看到模糊的线条时,您可以做两件事:仔细查看理想图像并尝试优化草图,或者只是停止着色。如果你做后者,你很可能不会走得太远。但是,您最多也只能粗略地理解您的理想程序。而且你仍然可能无意中越过了线!只是因为你不确定它在哪里。

你在寻找那条模糊的线条并试图重新定义它的过程中得到了我的祝福。越接近边缘,你就越确定它在哪里,越不可能越过它。

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

如果答案是“永不信任用户输入”,则草图模糊不清。

(如果你不同意:如果OP适用于“testxsshere.com”怎么办?繁荣!check-mate。)

(有人应该注册testxsshere.com)

答案 1 :(得分:1)

仅仅因为你没有向某人显示某个字段,并不意味着潜在的黑帽子不知道他们在那里。如果您的系统中有潜在的攻击媒介,请插入该漏洞。如果它被剥削了,那么向你的雇主解释你为什么不这样做是非常困难的。

答案 2 :(得分:1)

我不相信这个问题已被完全回答。如果用户只能攻击自己,他希望看到一个准确的XSS攻击。这实际上是通过CSRF和XSS的组合完成的。

使用CSRF,您可以让用户使用您的有效负载发出请求。因此,如果用户可以使用XSS攻击自己,你可以让他自己攻击(让他用你的XSS提出请求)。

来自The Web Application Hacker’s Handbook的引用:

  

共同的神话:

     

“我们并不担心这种低风险的XSS漏洞。用户只能利用它来攻击自己。“

     

即使是明显低风险的漏洞,在适当的情况下也可以为毁灭性的攻击铺平道路。采取纵深防御的安全措施需要消除每个已知的漏洞,无论它看起来多么微不足道。作者甚至使用XSS将文件浏览器对话框或ActiveX控件放入页面响应中,这有助于打破绑定到目标Web应用程序的kiosk模式系统。总是假设攻击者在设计利用小错误的方法时会比你更具想象力!

答案 3 :(得分:0)

,始终清理用户输入:

  1. 绝不信任用户输入
  2. 这样做不需要花费太多精力。
  3. 关键点是 1

答案 4 :(得分:0)

如果表单提交值的脚本或服务可以通过互联网获得,那么任何地方的任何人都可以编写一个脚本来向其提交值。所以:,清理所有收到的输入。

最基本的网络安全模型非常简单:

  

不信任您的用户

还值得链接到我在另一篇文章(Steps to become web-security savvy)中的回答: Steps to become web security savvy

我不敢相信我在没有提到标题问题的情况下回答:

  

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

阻止用户跨网站编写脚本,你保护自己的网站(或者更重要的是,你是客户的网站)成为跨网站脚本的受害者。如果你没有关闭已知的安全漏洞,因为你不会被打扰,那么重复业务将变得非常困难。或者以前的客户提供良好的口碑广告和推荐。

将其视为保护您的客户,考虑它 - 如果有帮助 - 将其视为保护您的业务