This topic created in 1216 days ago, the information mentioned may be changed or developed.
Supplement 1 · Jan 12, 2023
当发表评论或使用 V2EX 原生格式发表帖子的时候,「正文中出现的网址会变成可以点击的 <a> 链接❶」,「 GitHub 的 Gist 链接会自动加载为嵌入式的代码展示」,实现上是将 https ://gist.github. com/user/hash 链接渲染成一个 div:
<div><a href="Gist 链接">Gist 链接</a><button onClick="lazyGist">显示 Gist 代码</button></div>
当点击「显示 Gist 代码」这个按钮的时候,会调用 lazyGist 函数,该函数大概逻辑是请求 Embed Gist 的 Api ,将 Gist Api 返回的 html 片段替换掉这个 div (使用 $button.parent() 函数,button 元素的 parent 是 div❷)。
请求 Gist Api 的 Url 是从上文中渲染的 div 中的 a 标签取的(找 a 标签使用了 $button.parent().find("a")❸),没有任何校验。那么自然会想能不能替换成我们可以自己控制返回内容的 Url 呢?但后端的渲染引擎对 Gist Url 校验是很严格的,尝试多次后放弃。又尝试多种写法后,发现使用这种 payload 会出现渲染错误(防止渲染插入了空格):
https:// gist.github. com/1/1http https: //gist.github. com/1/1
会把 button 渲染在顶层,那么 button 的 parent 就成了帖子内容的顶级 div ,结合 ❶ ❷ ❸,我们只需在帖子顶部插入一个我们自己的 Url 就可以啦。
修复建议:重写加载 Gist 的 JS 的逻辑。
 |
|
1
MossFox Jan 12, 2023
确认有效 (移动端 Safari)
|
 |
|
5
4ark Jan 12, 2023 via iPhone
nb
|
 |
|
6
jingfelix Jan 12, 2023
确认有效,安卓 Edge + PC Chrome
|
 |
|
8
Jamari Jan 12, 2023 via iPhone
又没事,反正后端还是很严格
|
 |
|
9
Livid Jan 12, 2023
谢谢。暂时将这个按钮的功能去掉了。
|