# 网页读取器

可以注意到白名单 whitelist\_hostname 有题目所给的两个样例。

URI 的语法（摘自官方题解）

```
scheme:[//authority]path[?query][#fragment]
```

其中用 \[] 围住的是可选的。然后我们来看一下各部分：

* 协议 (scheme)：访问资源使用的协议，比如说 http, https 之类的。
* 来源 (authority)：来源中包含了主机名，和可选的用户信息和端口号，比如 [www.ustc.edu.cn](https://www.ustc.edu.cn), admin:[admin@www.example.com](mailto:admin@www.example.com):2333（使用用户名为 admin，密码为 admin，访问 [www.example.com](http://www.example.com/) 的 2333 端口获取资源）。
* 路径 (path)：比如说 /cgi-bin, /a/b/c/d/e/f/g 等，有等级 (hierarchical) 关系。
* 查询 (query)：没有等级 (non-hierarchical) 关系的数据。一般来说，查询中的参数会被网站的后端获取到，然后进行对应的处理，比如 ?q=keyword，?a=1\&b=2。
* 片段 (fragment)：指向一个更低级别的资源，例如 #Examples，浏览器访问时会滚动到 id 为 Examples 的标签。如果写过单页面应用 (SPA) 的同学可能会知道，一些框架处理路由时使用 hash 模式，这里的 hash 就是片段开头的 #。

让 check\_hostname 解释出主机名为 example.com 的同时，让 requests.get() 实际访问我们想要的地址。

```
http://web1/flag#@example.com
```

检验时忽略掉了@前的所有内容，但实际上访问的是[http://web1/flag](http://web1/flag)。

输入后获得flag。
