如何使用 python 在 URL 中捕获 javascript 代码注入?

How do I catch javascript code injection in URL using python?

如何检测格式错误的 URLs,或注入了 javascript 的 URLs

'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 是恶意的,而第二个则不是。我希望能够标记第一个。我可以使用正则表达式来匹配我想的脚本标签,但这是使用 Python?

的方法吗

很难做一个正则表达式来知道 URL 是否是脚本注入尝试。要匹配您给出的示例,搜索 <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}))

但是,如果这是一种输入净化的情况,请注意,也可以始终对 <>"' in any URL 没有损坏,所以也许:

url.replace('<', '%3C').replace('>', '%3E')\
   .replace('"', '%22').replace("'", '%27')

是一个更明智的做法(同时检查 scheme 确实是 "http:""https:")。或者用urllib.parse.urlparse把URL拆分成组件,然后解码再编码,最后用urllib.parse.urlunparse再做成一个URL。