如何检测格式错误的 URL 或注入(inject)了 javascript 的 URL
'http://example.com/portal/image/user_male_portrait?img_id=755109&t=1372243875358"><script>setTimeout(function () {document.body.innerHTML = \'<img src="http://images.example.com:9191/public/rickroll.gif" style="display: block; width: 100%">\'; }, 100);</script><!--'
'http://example.com/portal/image/user_male_portrait?img_id=566203&t=1350313911834'
第一个 URL 是恶意的,而第二个 URL 则不是。我希望能够标记第一个。我可以使用正则表达式来匹配我想的脚本标签,但这就是用 Python 实现的方法吗?
最佳答案
做一个正则表达式来知道一个 URL 是否是脚本注入(inject)的尝试是非常困难的。为了匹配您给出的示例,搜索 <script
就足够了。
但是一个<script>
标签并不是 HTML 中唯一危险的东西:例如考虑 URL http://example.com/portal/image/user_male_portrait?img_id=755109&t=1372243875358" onclick="setTimeout(function () { document.body.innerHTML = '<img src="http://images.example.com:9191/public/rickroll.gif" style="display: block; width: 100%">'; }, 100);"
。没有<script>
完全没有标签。
总而言之,在正则表达式中唯一真正能做的就是拒绝任何匹配的 URL
(?i)^(?!\s*https?://)|[<>"']
即拒绝任何有 <>"'
的 URL裸露;并拒绝所有以正则表达式 https?://
以外的任何内容开头的 URL (毕竟,即使有了之前的检查,我仍然可以做到
javascript:alert(Object.keys({gotcha:42}))
<小时/>
但是,如果这是一种输入清理的情况,那么请注意,人们也可以始终对 <
进行百分比编码, >
, "
和'
在 任何 URL 中都不会损坏,所以也许:
url.replace('<', '%3C').replace('>', '%3E')\
.replace('"', '%22').replace("'", '%27')
是更明智的做法(同时检查 scheme
确实是 "http:"
或 "https:"
)。或者使用urllib.parse.urlparse
将 URL 拆分为多个组件,然后对其进行解码和重新编码,最后使用 urllib.parse.urlunparse
再次将其变成 URL。
关于javascript - 如何使用 python 捕获 URL 中的 javascript 代码注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28767896/