在应用服务器上实现服务器发送事件时,您可以通过在消息末尾添加两个换行符
那么,如果您正在接收用户输入并将其转发给所有感兴趣的方(这通常是聊天应用程序中的情况),恶意用户是否可以在其有效负载中插入两个换行符以提前终止消息?更重要的是,既然他们可以访问一行的前几个字符,他们是否不能设置特殊字段,例如
似乎唯一的替代方法是扫描整个有效负载,然后将
但是,这不是非常低效吗?每个消息都需要扫描整个消息有效负载,然后进行替换,这不仅涉及扫描每个有效负载,还可能在恶意情况下重新分配。
还有其他选择吗?我目前正在尝试在WebSockets和SSE之间做出决定,因为它们非常相似,这个问题使我更倾向于使用WebSockets,因为如果它们能够避免这种潜在的漏洞,它们可能会更有效率。
编辑:为了澄清,我大多数时间都不知道是否有一种方法可以避免必须完全扫描每个消息以查找\n\n。如果没有,那么WebSockets是否也有同样的问题,需要完全扫描每个消息?因为如果是这样,那就无所谓了。但如果不是这种情况,那么似乎使用WebSockets比SSE更好。
\n\n
来终止消息并发送它,如this documentation page所示。那么,如果您正在接收用户输入并将其转发给所有感兴趣的方(这通常是聊天应用程序中的情况),恶意用户是否可以在其有效负载中插入两个换行符以提前终止消息?更重要的是,既然他们可以访问一行的前几个字符,他们是否不能设置特殊字段,例如
id
和retry
字段?似乎唯一的替代方法是扫描整个有效负载,然后将
\n
的实例替换为\ndata:
之类的内容,以便他们的整个消息有效负载必须保持在data
标记中的位置。但是,这不是非常低效吗?每个消息都需要扫描整个消息有效负载,然后进行替换,这不仅涉及扫描每个有效负载,还可能在恶意情况下重新分配。
还有其他选择吗?我目前正在尝试在WebSockets和SSE之间做出决定,因为它们非常相似,这个问题使我更倾向于使用WebSockets,因为如果它们能够避免这种潜在的漏洞,它们可能会更有效率。
编辑:为了澄清,我大多数时间都不知道是否有一种方法可以避免必须完全扫描每个消息以查找\n\n。如果没有,那么WebSockets是否也有同样的问题,需要完全扫描每个消息?因为如果是这样,那就无所谓了。但如果不是这种情况,那么似乎使用WebSockets比SSE更好。
message = message.replace(/\n+/g, '\n')
它将字符串中任意数量的连续换行符合并为一个换行符。 - IceMetalPunk