用 Windows 记事本打开 https 网址为什么会弹出 Windows 安全?

2017-08-08 20:34:08 +08:00
 y1261474584
让我输入用户名和密码(我怎么会知道!)。和用浏览器打开的效果完全不一样,应该出现的不是网页源代码吗?这是什么黑科技⁈
https://i.loli.net/2017/08/08/5989ad03b728f.png
你们可以去测试一番
2296 次点击
所在节点    问与答
16 条回复
ryd994
2017-08-08 20:48:31 +08:00
切,我 kde 还能开 sftp 呢
yksoft1
2017-08-08 20:56:41 +08:00
你查一下 notepad.exe 的导入表,有用到一个和网络有关的函数吗
geelaw
2017-08-08 21:00:49 +08:00
这是 common dialog 想要访问这个网络位置(当成文件夹,类似 network drive mapping ),而不是“下载并打开文件”。
yksoft1
2017-08-08 21:05:44 +08:00
Windows 标准文件操作的 CreateFile 那一套能不能支持 http 之类互联网上的协议都是问题吧
ProjectAmber
2017-08-08 21:18:43 +08:00
可能是 WebDAV。
lzhr
2017-08-08 21:46:54 +08:00
有些人不懂,又不去实践。
测试:
https://www.v2ex.com ,直接下载打开 html ;
https://baidu.com ,直接;
https://www.baidu.com ,需要密码;
https://www.12306.cn ,出现选择证书
crab
2017-08-08 22:02:44 +08:00
@yksoft1 notepad 绝对支持的。以前都这样看源码。
yksoft1
2017-08-08 22:24:05 +08:00
win8.1 cmd、“运行”对话框下 notepad http://www.cnbeta.com 出现 messagebox
---------------------------
记事本
---------------------------
文件名、目录名或卷标语法不正确。


---------------------------
确定
---------------------------

用 comdlg32 打开 对话框打开 还真出现了 html。

用 process explorer 查看 notepad 打开的文件,实际打开的是磁盘上的 C:\Users\user\AppData\Local\Microsoft\Windows\INetCache\counters.dat 这个文件,标题栏显示的文件名是典型的 IE 缓存文件名格式。
然后查看加载的模块,出现了 ieframe.dll 。
打开另一个记事本,不打开 打开 对话框,没有看到 ie 的 DLL 被加载;用 打开 对话框打开一个本地文件,ieframe.dll 被加载,但是,前面提到的那个文件没有被打开。
结论是,管理通用打开对话框的 comdlg32.dll 调用了 IE 的 com 组件将目标 url 下载到 ie 缓存并向记事本返回了 ie 缓存中的文件路径。
可以自己写一个用 GetOpenFileName 函数的程序测试一下。
yksoft1
2017-08-08 23:00:38 +08:00
测试例程
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main(int argc, char** argv)
{
int r;
char retpath[MAX_PATH+1];
OPENFILENAME ofn ;

memset(&ofn, 0, sizeof(ofn));

ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrDefExt = NULL;
ofn.lpstrFile = retpath;

if(argc>=2)
strncpy(retpath, argv[1], strlen(argv[1])<MAX_PATH?strlen(argv[1]):MAX_PATH);
else
ofn.lpstrFile[0] = '\0';

ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = NULL;
ofn.nFilterIndex = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = "Test";
ofn.Flags = 0;

r=GetOpenFileName(&ofn);

if(r)
printf("GetOpenFileName got filename %s", retpath);
else
printf("error: %d", GetLastError());

return 0;
}

编译:
D:\>c:\mingw2\bin\gcc gofn.c -lcomdlg32 -ogofn.exe

运行第一次(不输入命令行参数),弹出对话框输入 https://www.v2ex.com 后,对话框卡了一下后返回
D:\>gofn
GetOpenFileName got filename C:\Users\user\AppData\Local\Microsoft\Windows\INetCache\IE\TJ1BE227\3OQBB5YK

运行第二次,命令行输入
D:\>gofn c:\windows\win.ini
GetOpenFileName got filename C:\Windows\win.ini
对话框正常弹出并自动定位到正确的目录。

运行第三次,命令行输入
D:\>gofn https://www.v2ex.com
error: 0
对话框不弹出且 GetLastError 不能得到错误码。这就不知道为什么了。
yksoft1
2017-08-08 23:07:41 +08:00
将 GetLastError 改为 comdlg32 专用的 CommDlgExtendedError,结果如下
D:\>gofn h tt p s:// www.v2ex.com
error: 12290

返回错误代码 0x3002,即 FNERR_INVALIDFILENAME,错误的文件名。
azh7138m
2017-08-08 23:33:20 +08:00
@yksoft1 这个全角看着好难受。。。
yksoft1
2017-08-08 23:40:09 +08:00
@azh7138m 因为连续出现链接被 V2EX 系统警告了。

@lzjr 至于百度出现认证的原因,可能需要抓包才能知道了,我个人估计和反爬虫机制有关,https 请求和正常的有区别。我机子没装 IE 用的 12306 证书,开 12306 会出现带 IE 图标的错误对话框 0x80004002 不支持此接口。
yksoft1
2017-08-09 00:12:33 +08:00
另外,Windows 记事本好像只支持 DOS 行尾吧。。。
popok
2017-08-09 08:44:32 +08:00
抓个包看下
首先是 OPTIONS 请求
然后是 PROPFIND 请求,然后就弹出登录框了,这个和服务器配置有关吧
hx1997
2017-08-09 09:06:49 +08:00
我昨晚测试的爱奇艺和百度 ( https://www.XXX.com/) 都没有弹出要求凭据的对话框,Windows 10,不知道为啥
y1261474584
2017-08-10 10:20:04 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/381475

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX