如何使用 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。
如何检测格式错误的 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。