遇到403 Forbidden ,服务器端查询后结果是http get查询字符串中包含非法字符

原文链接:https://blog.csdn.net/mm_hello11/article/details/84261672

    https://blog.csdn.net/mm_hello11/article/details/84261672

前端的方法我这边都不能用,最后用了后端的转义方法HttpUtility.UrlEncode

 

报错解释:

HTTP GET请求通过查询字符串(即URL中"?"后面的部分)传递参数。如果查询字符串包含非法字符,服务器可能会拒绝请求并返回错误,因为这些非法字符可能会破坏URL的格式或者服务器的安全性。

非法字符通常指的是除字母、数字和某些预定义的字符(如-._~!$&'()*+,;=)以外的所有字符。

HTTP标准的两种请求方式:Post和Get,关于这两种请求方式的区别相关资料云集,这里不做阐述。然而,你是否注意到:
我们通过get方式从浏览器的地址栏传递数据给服务器,当参数的值中含有某些特殊转义字符的时候,没经过些许处理将得不到预期的结果。

例如:
当我们的请求的url为:
http: // localhost:8080/index.jsp?parameter=kalman03#kalman#1
或许你预期在服务器端获得的parameter的结果为kalman03#kalman#1,错!!!实际上得到parameter的值为kalman03。
这究竟是为什么呢?
原因:
parameter的值含有特殊字符#,浏览器自动截断#字符和其后面的值,这样得到的值就为kalman03。
推广:
当参数值中含有特殊字符 ?!=()#%& 的时候,获得的值同样也会出现与预期结果不一致的情况。
解决方案:
方法1:通过post方式传递数据;
方法2:对参数进行一次编码parameter=escape(parameter);

第一种解决方案不解释也能明白,现在解释下第二种方法的处理:
JavaScript escape() 函数的功能是把其中某些字符替换成了十六进制的转义序列。该方法不会对ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其他所有的字符都会被转义序列替换

 

在get请求参数中如果包含&符号,在发送请求时就会被当作参数的分割符处理
比如请求参数:
var url= "xxxx?name=" + "aaa&bbb"
期望的请求参数应该是name = aaa&bbb
实际的请求参数会变成 name = aaa 和 bbb=

处理方法

在拼接参数的时候,使用 encodeURIComponent() 进行手动转义。
var url= "xxxx?name=" + encodeURIComponent("aaa&bbb")

特殊特殊字符的含义

字符 特殊字符的含义 URL编码
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ 分隔目录和子目录 %2F
? 分隔实际的 URL 和参数 %3F
% 指定特殊字符 %25
# 表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D
示例代码:

复制代码
    //处理特殊字符get请求识别错误的情况
    //filename为带有特殊字符的url字符串
    var curFilename = null;
    //含有特殊字符的话,处理完再赋值(没有处理空字符串)
    if(filename.indexOf('#') != -1 || filename.indexOf('+') != -1 || filename.indexOf('/') != -1 || filename.indexOf('?') != -1 || filename.indexOf('%') != -1 || filename.indexOf('&') != -1 || filename.indexOf('=') != -1){
        curFilename = filename.replace(/([\#|\+|\/|\?|\%|\#|\&|\=])/g, function ($1) {
            return encodeURIComponent($1)
        })
    }else{
        //如果不含有特殊字符直接赋值
        curFilename = filename;
    }
    //发送请求(我这里是我项目中封装的,大家正常发送请求就可以)
    Cm.get(Cm.webroot + curFilename, function (msg) {
 
    },function (msg) {
 
    })
复制代码

 

 

参数进行加密,后台进行解密,也可以解决这个问题。

posted @   yinghualeihenmei  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示