C# 查询字符串的奇怪编码

C# 查询字符串的奇怪编码,c#,encoding,request.querystring,C#,Encoding,Request.querystring,我为演示创建了两个aspx页面 第1页-WebForm1.aspx <asp:TextBox ID="txtTest" runat="server" Width="100px"></asp:TextBox> <asp:Button ID="btnClick" runat="server" Text="test" Width="100px" OnClick="btnClick_Click"/> protected void Page_Load(obje

我为演示创建了两个aspx页面

第1页-WebForm1.aspx

<asp:TextBox ID="txtTest" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="btnClick" runat="server" Text="test" Width="100px" OnClick="btnClick_Click"/>

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Request.QueryString["text"] == null || string.IsNullOrEmpty(Request.QueryString["text"].ToString()))
                txtTest.Text = "ö";
            else
                txtTest.Text = Request.QueryString["text"].ToString();
        }
    }

    public void btnClick_Click(object sender, EventArgs e)
    {
        HttpResponse response = HttpContext.Current.Response;
        response.Write(string.Format("<script>window.location = '{0}';</script>", HttpUtility.JavaScriptStringEncode("WebForm2.aspx?text=" + HttpUtility.UrlEncode(txtTest.Text))));
        response.End();
    }
我们可以看到URL主体有奇怪的编码,为什么要生成%u00f6?它能回到%c3%b6吗?

当我们点击后退按钮返回到第1页时,它的推荐人不见了。实际上,我认为奇怪的编码导致了这个问题,因为当我使用F12开发人员工具更改操作(从“%u00f6”更改为“%c3%b6”),然后单击“上一步”按钮时,生成了引用者


如果您能给出答案,我将不胜感激。

编码行为是一种标准。根据

2.4。何时编码或解码

在正常情况下,URI中八位字节的唯一时间
在从生成URI的过程中,
它的组成部分。这是一个实现确定哪个 保留字符的个数将用作子组件分隔符
并且可以安全地用作数据。一旦产生了URI,它总是 以百分比编码的形式

当URI被取消引用时,组件和子组件 对特定于方案的解引用过程(如有)具有重要意义
必须在内部编码的八位字节百分比之前进行分析和分隔 这些组件可以被安全地解码,否则数据可能会丢失
被误认为是组件分隔符。唯一的例外是
与未保留字符中的字符相对应的编码八位字节百分比
设置,可随时解码。例如,八位组
与波浪号相对应的(~)字符通常编码为“%7E”
通过旧的URI处理实现;“%7E”可以替换为 “~”而不改变其解释

因为百分比(“%”字符用作
百分比编码的八位字节,必须将其百分比编码为“%25”才能进行编码
在URI中用作数据的八位字节。实施不得
百分比对同一字符串进行多次编码或解码,如解码
已解码的字符串可能会导致误解百分比

百分比编码的情况是对已经百分比编码的字符串进行编码

如果要进行一些测试,还可以使用查看预期的url编码输出

至于推荐人失踪的原因,你可以看看

当最终用户

  • 在浏览器地址栏本身中输入网站URL
  • 通过浏览器维护的书签访问站点
  • 作为窗口/选项卡中的第一页访问了站点
  • 单击外部应用程序中的链接
  • 从https URL切换到http URL
  • 从https URL切换到其他https URL
  • 已安装安全软件(防病毒/防火墙/等),可从所有请求中删除推荐人
  • 在一个代理后面,该代理从所有请求中删除推荐人
  • 以编程方式访问该站点(如curl),而无需设置引用者标题(searchbots!)
经过一番挖掘后,我从墙上看到了这个

14.36参考资料

Referer[sic]请求头字段允许客户端指定, 为了服务器的利益,从中获取资源的地址(URI) 已获得请求URI(“referer”),但标头 字段拼写错误。)Referer请求标头允许服务器 生成指向感兴趣的资源的反向链接列表、日志记录、, 优化缓存等。它还允许过时或键入错误的链接 跟踪维护。如果 请求URI是从没有自己URI的源获取的, 例如从用户键盘输入

检查段落的最后一句话,我相信在您的示例中,您“更改”了编码

我使用F12开发人员工具将操作(从“%u00f6”更改为 “%c3%b6”)


谢谢你,约翰!我正在阅读并尝试第一个答案。从我的样本来看,它不在导致推荐人失踪的列表中。当我在表单中手动更改操作(从“%u00f6”更改为“%c3%b6”),然后单击“上一步”按钮时,将返回推荐人。如果您对此感兴趣,可以查看。
<asp:TextBox ID="txtResult" runat="server" Width="200px"></asp:TextBox>
<asp:Button ID="btnBack" runat="server" Text="back" Width="50px" OnClick="btnBack_Click"/>

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Request.QueryString["text"] == null || string.IsNullOrEmpty(Request.QueryString["text"].ToString()))
                txtResult.Text = "empty";
            else
                txtResult.Text = Request.QueryString["text"].ToString();
        }
    }

    public void btnBack_Click(object sender, EventArgs e)
    {
        HttpResponse response = HttpContext.Current.Response;
        response.Write(string.Format("<script>window.location = '{0}';</script>", HttpUtility.JavaScriptStringEncode("WebForm1.aspx?text=" + HttpUtility.UrlEncode(txtResult.Text))));
        response.End();
    }
#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  
6   200 HTTP    localhost:56484 /WebForm2.aspx?text=%c3%b6  835 private text/html; charset=utf-8    iexplore:12316          
8   200 HTTP    localhost:56484 /WebForm2.aspx?text=%u00f6  175 private text/html; charset=utf-8    iexplore:12316          
9   200 HTTP    localhost:56484 /WebForm1.aspx?text=%c3%b6  830 private text/html; charset=utf-8    iexplore:12316          
10  200 HTTP    localhost:56484 /WebForm1.aspx?text=%u00f6  175 private text/html; charset=utf-8    iexplore:12316          
11  200 HTTP    localhost:56484 /WebForm2.aspx?text=%c3%b6  834 private text/html; charset=utf-8    iexplore:12316