此问题涉及URL的查询字符串部分中的?字符,这些字符出现在标记字符之后.
根据维基百科,某些字符保持原样,其他字符编码(通常带有%转义序列).
我一直试图将其跟踪到实际规格,以便我理解维基百科页面中每个要点背后的理由.
矛盾例1:
在HTML规范说来编码空间,+并按照其余RFC1738.但是,这个RFC说这~是不安全的,而且"[a] ll不安全的字符必须始终在URL中编码".这似乎与维基百科相矛盾.
实际上,IE8 ~在它生成的查询字符串中进行编码,而FF3则按原样进行编码.
矛盾示例2:
维基百科指出,它未提及的所有字符都必须进行编码.!在维基百科中没有提到.但是RFC1738声明这!是一个"特殊"字符并且"可以使用未编码的".这似乎与维基百科相矛盾,维基百科说它必须编码.
实际上,IE8 !在它生成的查询字符串中进行编码,而FF3则按原样进行编码.
据我所知,这可能是为了对那些在维基百科和规范之间存在疑问的字符进行编码.甚至可能编码所有不是[A-Za-z0-9]的东西.我想知道这方面的实际标准.
结论
维基百科上描述的算法精确编码那些不是RFC3986非保留字符的字符.也就是说,它编码除字母数字和字母之外的所有字符-._~.作为一种特殊情况,空间被编码为+而不是%20RFC3986.
某些应用程序使用较旧的RFC.为了比较,RFC2396无保留字符是字母数字和!'()*-._~.
为了比较,HTML5工作草案算法编码除字母数字和字母以外的所有字符*-._.空间的特殊情况编码仍然存在+.值得注意的差异*是未编码和~编码.(从技术上讲,这种处理*与RFC3986是兼容的,即使它*是在reserved因为它sub-delims在query生产中允许的范围内.)
我目前正在使用CodeIgniters教程中的精彩文档.然而,有一个经常使用的术语,它被称为"slug".我经常环顾四周,找出这个术语的含义,我无法理解它是什么以及它是什么.以下是使用时间的示例:
使用此代码,您可以执行两个不同的查询.您可以获取所有新闻记录,或通过其slug获取新闻项目
我正在开发一个asp.net mvc 4 Web应用程序.我正在使用.net 4.5.现在我有以下WebClient()课程:
using (var client = new WebClient())
{
var query = HttpUtility.ParseQueryString(string.Empty);
query["model"] = Model;
//code goes here for other parameters....
string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"];
var url = new UriBuilder(apiurl);
url.Query = query.ToString();
string xml = client.DownloadString(url.ToString());
XmlDocument doc = new XmlDocument();
//code goes here ....
}
Run Code Online (Sandbox Code Playgroud)
现在我已经注意到一个问题,当这些参数中的一个包含非ASCII承租人如£,¬等....
现在最后的查询将有任何非ASCII字符(例如£)编码错误(as %u00a3).我读到了这个问题,似乎我可以取代: -
url.Query = query.ToString();
Run Code Online (Sandbox Code Playgroud)
同
url.Query = ri.EscapeUriString(HttpUtility.UrlDecode(query.ToString()));
Run Code Online (Sandbox Code Playgroud)
现在使用后面的方法将编码£为%C2%A3正确的编码值.
但我面临的问题是,url.Query = Uri.EscapeUriString(HttpUtility.UrlDecode(query.ToString())); …
说我有以下网页:
<html>
<script>
document.write('querystring=' + location.search.substr(1));
</script>
<html>
Run Code Online (Sandbox Code Playgroud)
我在这样的URL打开它:
http://completely-secure-site/?<script>alert('fsecurity')</script>
Run Code Online (Sandbox Code Playgroud)
在所有尝试的浏览器(Chrome 57,Firefox 52和Safari 10)中,结果是:
查询字符串=%3Cscript%3Ealert(%27fsecurity%27)%3C /脚本%3E
因为尖括号<>是无效的URL字符,他们似乎得到自动的方式浏览器中编码,才可以拿到附近的JS运行时的任何地方.
这让我相信简单地在客户端上直接渲染查询字符串document.write总是安全的,而不是可能的XSS向量.(我意识到当然还有许多其他方式可以让应用程序容易受到攻击,但让我们坚持这里描述的精确案例.)
我在这个假设中是否正确?
与问题无关,但有趣的是一边.如果我首先解码URI,那么浏览器的行为是不同的:document.write(decodeURI(location.search.substr(1)));.Chrome和Safari中的XSS Auditor会阻止该页面,而Firefox会显示警报.
为什么不URI.escape逃避单引号?
URI.escape("foo'bar\" baz")
=> "foo'bar%22%20baz"
Run Code Online (Sandbox Code Playgroud) 在ASP.NET中,httpRuntime/@requestPathInvalidCharacters属性默认为<,>,*,%,&,:,\.据我所知,这些字符在URL的路径部分(基于此属性的默认设置)中是不允许的,但应允许其中一些字符.在该列表中,我很难理解为什么*,&,:默认情况下不允许这样做.例如,以下URL 有效,但默认情况下会被ASP.NET拒绝:
要通过电子邮件获得一个独特的人: http ://myservice.com/People/Email=jim@smith.net
要在州内获得独特的地点: http ://myservice.com/States/VA/Localities/FIPS=001
我也可以换掉=for :来默认使ASP.NET拒绝URL.但这些字符/ URL是有效的,应该/做得很好.
那么,有没有人知道为什么选择这些不允许的角色?
(相关文章/回答:https://stackoverflow.com/a/13500078/374198)
我正在尝试使用Spring的RestTemplate :: getForObject来请求具有URL查询参数的URL.
我试过了:
无论我使用哪一个,使用URLEncoder :: encode对url查询参数进行编码都会进行双重编码,并且使用此编码会使url查询参数无法编码.
如何在不对URL进行双重编码的情况下发送此请求?这是方法:
try {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(detectUrl)
.queryParam("url", URLEncoder.encode(url, "UTF-8"))
.queryParam("api_key", "KEY")
.queryParam("api_secret", "SECRET");
URI uri = builder.build().toUri();
JSONObject jsonObject = restTemplate.getForObject(uri, JSONObject.class);
return jsonObject.getJSONArray("face").length() > 0;
} catch (JSONException | UnsupportedEncodingException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
没有URLEncoder:
http://www.example.com/query?url=http://query.param/example&api_key=KEY&api_secret=SECRET
Run Code Online (Sandbox Code Playgroud)
使用URLEncoder:
http://www.example.com/query?url=http%253A%252F%252Fquery.param%252Fexample&api_key=KEY&api_secret=SECRET
Run Code Online (Sandbox Code Playgroud)
':'应编码为%3A,'/'应编码为%2F.这确实发生了 - 但是%编码为%25.
我需要实现函数来检查路径和URL是相对的,绝对的还是无效的(语法上无效 - 不管资源是否存在).我应该寻找的案件范围是什么?
function check_path($dirOrFile) {
// If it's an absolute path: (Anything that starts with a '/'?)
return 'absolute';
// If it's a relative path:
return 'relative';
// If it's an invalid path:
return 'invalid';
}
function check_url($url) {
// If it's an absolute url: (Anything that starts with a 'http://' or 'https://'?)
return 'absolute';
// If it's a relative url:
return 'relative';
// If it's an invalid url:
return 'invalid';
}
Run Code Online (Sandbox Code Playgroud) HttpUtility.UrlEncode("!!!test", Encoding.GetEncoding("windows-1251"))
Run Code Online (Sandbox Code Playgroud)
它不编码!来%21-为什么?
我的Web应用程序将URL段存储在数据库中.这些网址细分基于用户提交的内容.
我应该对URL中出现的字符串使用哪种排序规则?
我的假设是ASCII General CI(?)基于这个问题:哪些字符使URL无效?
url ×4
http ×3
.net ×2
asp.net ×2
c# ×2
html ×2
php ×2
uri ×2
asp.net-mvc ×1
codeigniter ×1
collation ×1
encoding ×1
frameworks ×1
java ×1
javascript ×1
mysql ×1
query-string ×1
relative-url ×1
ruby ×1
security ×1
spring ×1
standards ×1
urlencode ×1
xss ×1