在url中显示用户输入是否危险



我正在使用node.js和express4

在我的应用程序中,用户可以写帖子并给他们一个标题。我会为每个帖子生成一个唯一的ID。

然后可以通过url访问帖子:域/帖子的ID/帖子的标题服务器端,解析url后,我只使用帖子的ID来正确查询我的数据库。我从不使用url中的帖子标题,因为我可以安全地从数据库中获得它。

因此,基本上,urldomain/posts/A-valid-ID-of-A-post/ANYTHING指向帖子的页面。

我的问题是:这危险吗?攻击者能利用这一点吗如果是,我该如何保护自己?

注:我受到html注入的保护,所以我的问题只是关于URL。

你可以使用它,事实上我已经看到许多网站/论坛和stackoverflow本身使用这种方法,例如查看网页的当前url:

stackoverflow.com/questions/25763180/is-it-dangerous-to-display-user-input-in-url

它并没有那么危险,只需记住它是非序列化输入并相应地处理它-一种潜在的输入攻击(实际上,总是这样做!)

这是安全的,但您应该考虑对字符串进行百分比编码。

某些字符对浏览器具有特殊意义,例如#字符,它用于查找用于滚动的锚标记(格式为<a name="foo">),也可作为window.location.hash属性用于JavaScript。根据您的网站及其JavaScript代码,如果从该属性读取数据,攻击者可能会发起基于DOM的XSS攻击。虽然在您的URL中允许#字符不会影响是否存在此类漏洞,但如果存在此漏洞,攻击者可能会通过故意创建包含此字符的URL来利用此功能进行另一次攻击,从而使您网站上的任何动态生成的链接都能执行攻击。如果没有这种杠杆作用,受害者将不得不关注攻击者的链接(例如,来自电子邮件或论坛)底线:为了安全起见,最好对#字符进行百分比编码或删除

您还应该对其他特殊字符进行百分比编码(或删除),特别是以下字符之外的任何字符:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=

因为这些字符是根据RFC 3986在URL中唯一有效的字符。

如果您实施了一些基本的安全预防措施,它是安全的。

如果你的帖子ID是一个数字,你可以检查这个值是否是一个有效的正数。如果是,请继续;否则,返回错误或显示404页面。

如果您的post ID是字符串值,那么如果您的存储是RDBMS,则有可能注入SQL。在这种情况下,底层DBMS模块应该提供一个函数来转义字符串值。例如,cubrid数据库的node模块node cubrid具有_escapeString()辅助函数。

一旦你实施了这些基本的检查和消毒,就可以安全地将帖子ID放在URL中。

我不知道它在安全方面是否危险,但即使安全,也不应该这样做。许多字符可能会给用户(例如任何不可见的字符、同源词)或机器人(#?)带来混乱。URL有特定的语法,让用户在其中插入任何旧字符串都不是一个好的设计。像许多站点(包括Stack Overflow)那样,将它们分类为只包含小写字母、短划线和数字。

最新更新