在我正在编写的一个 Web 应用程序中,我让登录的访问者有机会输入一个 URL 以与他们上传的图片一起使用,作为返回他们网站的链接。
我打算验证输入的字符串以确保它是一个 URL,但是在考虑了解决方案的复杂性之后,我认为可能没有必要。
但是,如果不这样做,我可能会遗漏任何安全隐患吗?(我正在考虑有效 URL 可能包含一些恶意脚本或类似内容的情况。)
在我正在编写的一个 Web 应用程序中,我让登录的访问者有机会输入一个 URL 以与他们上传的图片一起使用,作为返回他们网站的链接。
我打算验证输入的字符串以确保它是一个 URL,但是在考虑了解决方案的复杂性之后,我认为可能没有必要。
但是,如果不这样做,我可能会遗漏任何安全隐患吗?(我正在考虑有效 URL 可能包含一些恶意脚本或类似内容的情况。)
URL 的安全问题与其有效性关系不大(尽管为了发现错误而进行基本检查是件好事,当然您需要使用与一般数据相同的输入验证和输出转义代码);它更多地与危险的 URL 方案有关。
最值得注意的是javascript:
,URL 根本不是真正的位置,而是要注入链接它们的页面的脚本内容,从而导致跨站点脚本漏洞。还有其他类似问题的方案。最好只允许已知良好的方案,例如检查字符串是否以http://
or开头https://
。
此功能似乎是跨站点请求伪造 (CSRF) 攻击的完美示例,其中上传者链接到触发 CSRF 攻击的网页。
为了降低 CSRF 攻击的风险,请确保攻击站点无法预测具有站点影响的操作。这通常通过所谓的令牌来完成,这是一个只有您的站点和登录的访问者知道的随机值。
正确验证 URL 并非易事。您可以接近,但它仍然不一定涵盖 RFC 允许的所有内容。只要您不将 URL评估为输入,运行 html_escape() 或您的框架的等效项就足以保护您的站点免受偶然的字符串恶作剧。
您可能需要研究您的框架,以了解您需要针对跨站点脚本、SQL 注入和其他相关问题采取哪些预防措施(如果有)。大多数可能出错的事情都与未经处理的输入有关,但您的里程可能会有很大差异。
如果您期望 100% 安全,那么保护用户可能不是一个合理的设计目标。毕竟,Web 不是受保护的沙箱。