在应用服务器上实现服务器发送事件时,您可以终止消息并通过以两个换行符结束它们来发送消息:\n\n
,如this documentation page所示。
那么,如果您正在接收用户输入并将其转发给所有相关方(在聊天应用程序中很常见),该怎么办?恶意用户是否不能在有效载荷中插入两个换行符以尽早终止消息?甚至,既然他们可以访问行的第一个字符,他们是否可以不设置诸如id
和retry
字段之类的特殊字段?
似乎唯一的替代方法是扫描它们的整个有效负载,然后将\n
的实例替换为\ndata:
,这样它们的整个消息有效负载就必须保持其在{ {1}}标签。
但是,这不是很没效率吗?必须扫描每个消息的整个消息有效负载,然后可能进行替换,这不仅涉及扫描每个完整的负载,而且在恶意的情况下也需要重新分配。
还是有其他选择?我目前正试图在websocket和SSE之间做出决定,因为它们非常相似,这个问题使我对WebSockets了解更多,因为如果他们能够避免此潜在漏洞,似乎它们会更有效。 / p>
编辑:为澄清起见,我几乎不知道是否有一种方法可以围绕每个邮件完整扫描data
。如果不是,WebSockets是否会遇到相同的问题,您需要整体扫描每条消息?因为如果是这样,那就没关系。但是,如果不是这样,那么似乎比SSE更倾向于使用websocket。
答案 0 :(得分:0)
如果您正确编码用户数据,则不必扫描有效负载。使用JSON可以安全地在服务器发送的事件中使用“数据”字段,因为JSON会默认对JSON进行换行并控制字符,如RFC所述:
字符串的表示类似于C语言中使用的约定 编程语言家族。字符串开头和结尾 引号。所有Unicode字符都可以放在 引号,必须转义的字符除外: 引号,反向固线和控制字符(U + 0000 通过U + 001F)。
https://tools.ietf.org/html/rfc7159#page-8
重要的是,没有人会潜入换行符,但这对服务器发送的事件并不新鲜,标头由一行换行隔开,也可以被篡改(如果编码不正确),请参见https://www.owasp.org/index.php/HTTP_Response_Splitting >
这里有一个使用json编码的服务器发送的应用程序示例: https://repl.it/@BlackEspresso/PointedWelloffCircles 即使允许使用换行符,您也不能篡改数据字段
对souldnt进行编码会阻止您使用服务器端事件,但是websocket和sse之间存在主要差异。要进行比较,请参见以下答案:https://stackoverflow.com/a/5326159/1749420
答案 1 :(得分:0)
除非我遗漏了一些明显的内容,否则清理输入内容是Web开发中的常识。
由于您共享的来源明确提到了一个PHP示例,因此我在这里做了一些研究和展望:
https://www.php.net/manual/en/filter.filters.sanitize.php
FILTER_SANITIZE_SPECIAL_CHARS
HTML转义符'“ <>&和ASCII值小于32的字符, (可选)剥离或编码其他特殊字符。
和:
'\n' = 10 = 0x0A = line feed
所以我不确定我是否理解为什么您会认为将某些输入转换为字符实体肯定是一件坏事。
清理的目的是避免用户通过上传不需要的输入来滥用系统。