caw*_*caw 5 url android uri android-webview
使用URI时
String myUri = "https://evil.example.com\\.good.example.org/";
// or
String myUri = "https://evil.example.com\\@good.example.org/";
Run Code Online (Sandbox Code Playgroud)
在Java中,在Android上的URI的授权部分的主机或用户信息反斜线导致之间如何Android的不匹配android.net.Uri和android.webkit.WebView解析URI就其主机.
Uri类(和卷曲)治疗evil.example.com\.good.example.org(第一个例子)或甚至good.example.org(第二个例子)作为URI的主机.WebView类(和Firefox和Chrome)治疗evil.example.com(两个例子)作为URI的主机.这是已知的,预期的还是正确的行为?这两个班级是否遵循不同的标准?
看看规范,似乎RFC 2396和RFC 3986都不允许在用户信息或权限中使用反斜杠.
是否有任何解决方法可确保此处的行为一致,尤其是出于验证目的?以下补丁看起来是否合理(与WebView一般正确性一起使用)?
Uri myParsedUri = Uri.parse(myUri);
if ((myParsedUri.getHost() == null || !myParsedUri.getHost().contains("\\")) && (myParsedUri.getUserInfo() == null || !myParsedUri.getUserInfo().contains("\\"))) {
// valid URI
}
else {
// invalid URI
}
Run Code Online (Sandbox Code Playgroud)
一个可能的缺陷是,此解决方法可能无法捕获导致解析不一致主机的所有情况.你知道其他什么(除了反斜杠)导致两个类之间不匹配吗?
众所周知,Android WebView 4.4 会转换一些 URL,在链接的问题中描述了如何防止这种情况的一些步骤。从您的问题来看,尚不完全清楚您的需求是基于该问题还是其他问题。
您可以使用字符表中的相应数字来屏蔽反斜杠和其他符号。在 URL 中,数字以十六进制书写。
Hexadecimal: 5C
Dezimal: 92
Sign: \
Run Code Online (Sandbox Code Playgroud)
该代码在 URL 中的每个符号前面添加了%,替换后您的代码如下所示:
String myUri = "https://evil.example.com%5C%5C.good.example.org/";
// or
String myUri = "https://evil.example.com%5C%5C@good.example.org/";
Run Code Online (Sandbox Code Playgroud)
可能仍然需要添加斜杠来分隔域和路径:
String myUri = "https://evil.example.com/%5C%5C.good.example.org/";
// or
String myUri = "https://evil.example.com/%5C%5C@good.example.org/";
Run Code Online (Sandbox Code Playgroud)
反斜杠是否有可能根本不应用于网络通信,而是用作某些过程(如正则表达式)或 JavaScript(Json)或其他步骤中的输出的转义?
奖励;-)
下面是一个 php 脚本,它打印大多数 UTF-8 符号的表格以及相应的十六进制和十进制数字。(它仍然应该包装在一个 html 模板中,也许包括 css):
<?php
$chs = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
$chs2 = $chs;
$chs3 = $chs;
$chs4 = $chs;
foreach ($chs as $ch){
foreach ($chs2 as $ch2){
foreach ($chs3 as $ch3){
foreach ($chs4 as $ch4){
echo '<tr>';
echo '<td>';
echo $ch.$ch2.$ch3.$ch4;
echo '</td>';
echo '<td>';
echo hexdec($ch.$ch2.$ch3.$ch4);
echo '</td>';
echo '<td>';
echo '&#x'.$ch.$ch2.$ch3.$ch4.';';
echo '</td>';
echo '</tr>';
}
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)