对于web端URL的一些安全建议

对于web端URL的一些安全建议

构建基于用户输入的全新URL的时候

1.如果允许用户构造URL的路径,查询或者片段ID这几部分的时候:

如果其中一部分未能正确地进行转义,这中URL很可能会产生出人意料的结果,例如,假如构造了一个用户可见的HTML按钮,令它和一个服务器端的处理关联起来,这个时候宁可选择保守的做法:如果需要插入攻击者能控制的字段值,除了字母和数字,最好把所有的数据都按照百分号编码形式转义一下!!!

2.如果允许用户提供协议名称或者授权信息部分数据:

这会带来很严重的代码注入和钓鱼风险!请按“设计URL输入过滤器”和“需要从接收到的URL里进行参与解码”


设计URL输入过滤器

  1. 相对URL:禁用相对URL,或者明确地改写成绝对路径以避免麻烦。其他方式都会存在风险的。
  2. 协议名称:只允许出现可接受的几种协议类型:http://、https://和ftp://。不要使用黑名单方式去验证,这样非常不安全。
  3. 授权信息部分:主机部分应该只包含数字和字母以及'-'和‘.’,在它的后面只能跟着“/”,"?"."#"或者字符串结束符。允许其他任何数据都有可能带来风险。如果需要检查主机名,请确保合理的使用从右往左的截取匹配模式。
  4. 补充:在很罕见的情况下,可能还需要检查URL里面的IDNA,IPv6括号表示法、端口号或者HTTP验证授权信息等,如果确实需要,必须对整个URL进行彻底的解析,验证各个部分,拒绝不正常的值,重新把整个URL序列化成一个没有歧义,符合规范,进过恰当转义的表达形式。

需要从接收到的URL里进行参与解码

千万不要因为标准这么说的,浏览器也理应是这么做的,就想当然地认为特定的字符串就一定被转义了。在反悔任何从URL获取的数值或者把它放入数据库进行查询前,拼接成新的URL之前,都需要仔细严谨的过滤清理危险的字符。

PS:比较优秀的做法是:

1.如果用户使用了某个网址作为参数传递的时候,使用encodeURIComponent()将其编码,这样就不会影响url的传递了,

var url = "htti://example.com?url=" + encodeURIComponent(window.location.href);



document.write(encodeURIComponent("http://www.example.com.cn"))
document.write("<br />")
document.write(encodeURIComponent("http://www.example.com.cn/p 1/"))
document.write("<br />")
document.write(encodeURIComponent(",/?:@&=+$#"))

输出

http%3A%2F%2Fwww.example.com.cn
http%3A%2F%2Fwww.example.com.cn%2Fp%201%2F
%2C%2F%3F%3A%40%26%3D%2B%24%23




2.如果用户传递的参数中存在会影响到url的参数的时候,建议使用encodeURI()将其编码掉。

var url = encodeURI("http://www.example.com.cn/My first/")
//  http://www.example.com.cn/My%20first/





转载于:https://my.oschina.net/bosscheng/blog/179524

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值