安全开发之404页面检测 | 宜武汇-ag真人国际厅网站

先来看看机器人怎么说:

要检测一个网页是否是404页面,你可以尝试以下方法:
http状态码检查:发送http请求并检查返回的状态码。如果网页是404页面,服务器将返回404状态码。你可以使用编程语言或工具(如python的requests库)发送http请求,并检查返回的状态码是否为404。
页面内容检查:发送http请求并获取网页内容。然后,检查页面内容是否包含404相关的文本或关键词。通常,404页面会包含类似于”404″、”页面未找到”、”not found”等关键词。你可以使用编程语言或工具对获取的页面内容进行文本匹配或关键词搜索,以确定是否为404页面。
网页截图比对:使用自动化测试工具,如selenium,可以模拟浏览器行为打开网页并截取页面截图。然后,你可以比对该截图与预期的404页面截图进行比对。如果它们相似度很高,则可能是404页面。
这些方法可以根据你的需求和技术背景进行选择和实施。需要注意的是,有些网页可能会使用javascript动态生成内容,这可能需要更高级的技术来处理。

什么是404界面

狭义的404界面就是http响应码返回404或503等不可达值的网页
广义的来说,404界面是一个统称,指的是协议404或者内容404

404页面有哪些特征

1、返回的httpcode是404/503/401等不可达code
2、title里面有”不存在“、”不可达“等关键词
3、内容里面有“不存在”、“找不到”等关键词
4、链接被重定向到了特定的404或503域名或页面
5、对于单个网站来说,所有的404页面结构比较统一

检测方案

针对上述404页面的特征,我们需要逐个实现

首先,我们使用jsoup库解析html,然后得到title标签里面的内容

拿到title之后,我们再进行比对即可,利用java里面的contains方法即可

首先需要获取到html里面的内容区,在没有使用智能提取技术之前,我们可以先去除标签获取内容,但是这确实是会带来很大的误报

import org.apache.commons.lang3.stringescapeutils; import java.io.ioexception; import java.nio.charset.standardcharsets; import java.util.regex.matcher; import java.util.regex.pattern; public class htmlutil { public static string delhtmltag(string htmlstr) { string regex_script = "]*?>[\\s\\s]*?<\\/script>"; //定义script的正则表达式 string regex_style = "]*?>[\\s\\s]*?<\\/style>"; //定义style的正则表达式 string regex_html = "<[^>] >"; //定义html标签的正则表达式 pattern p_script = pattern.compile(regex_script, pattern.case_insensitive); matcher m_script = p_script.matcher(htmlstr); htmlstr = m_script.replaceall(""); //过滤script标签 pattern p_style = pattern.compile(regex_style, pattern.case_insensitive); matcher m_style = p_style.matcher(htmlstr); htmlstr = m_style.replaceall(""); //过滤style标签 pattern p_html = pattern.compile(regex_html, pattern.case_insensitive); matcher m_html = p_html.matcher(htmlstr); htmlstr = m_html.replaceall(""); //过滤html标签 return htmlstr.trim(); } public static string htmltextformat(string htmltext) { htmltext = htmltext .replaceall("(\\\\n) ", " ") .replaceall("(\\\\t) "," ") .replaceall("(\t) "," ") .replaceall("(\n) "," "); htmltext = htmltext.replaceall("  "," "); htmltext = htmltext.replaceall("  "," "); return htmltext; } public static string getcontent(string html) { string ans = ""; try { html = stringescapeutils.unescapehtml4(html); html = delhtmltag(html); html = htmltextformat(html); return html; } catch (exception e) { e.printstacktrace(); } return ans; } } 

上面的getcontent方法便是我们获取到html内容的方法。

需要传入url,并对url进行解析

urlpattern 是定义的一套检测规则的对象类,以下是大概的格式

- pattern: '\b(404|503)\b' description: '检测链接的域名部分包含404或503' location: 'host'

上述规则检测域名的host部分中是否有404或者503

这里有两个方案
方案一:自建404页面结构库,让用户调用时与我们的自建库进行比对
方案二:用户自己传入404页面和一个正常页面,我们利用页面结构相似度比较算法来确定是否为404页面

先来看下页面结构的算法

页面结构算法我在专栏的另外一篇博客中有专门讲解,请大家移步观看
然后,我们来看看调用的方法

优化迭代

由于上述写法中我们都是将检测的东西写死在程序中,不具有可扩展性,所以我们需要对此进行扩展,扩展的思路便是对于所有判断性条件都做成配置形式的,而不是走特判。
例如,我们可以对链接里面有404或503的编写如下的配置

rule_name: '检测链接的域名部分包含404或503' url_patterns: - pattern: '\b(404|503)\b' description: '检测链接的域名部分包含404或503' location: 'host' rule_name: '检测到路径中包含404或503' url_patterns: - pattern: '\/(?:.*\/)?(404|503)\/' description: '检测到路径中包含404或503' location: 'path' rule_name: '检测到查询字符串中包含404或503' url_patterns: - pattern: '[?&](?:[^&=] =[^&=] &)*(?:[^&=] =(404|503))(?:&|$)' description: '检测到查询字符串中包含404或503' location: 'query'

给title添加如下检测配置

404 503 页面未找到 服务不可用 错误 错误页面 访问被拒绝 权限拒绝 页面不存在 链接不存在 不存在 not found

http响应码的配置

404 503 401 400 500

页面结构的配置

rule_name: 'pan.baidu.com' rules: - struct: '#document-html-head-body-meta-title-link-link-style-style-style-div-header-a-nav-a-span-div-a-em-div-div-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-a-span-span-iframe-div-ul-li-a-li-em-span-div-iframe-em-div-span-a-span-span-a-span-a-span-a-span-a-span-a-span-a-span-a-section-div-div-div-div-h3-div-p-p-p-div-p-a-p-a-style-div' score: '0.8' name: '404页面' - struct: '#document-html-head-body-title-meta-meta-meta-meta-meta-meta-meta-meta-link-link-link-link-link-link-link-link-link-style-link-link-link-link-style-style-style-style-div-div-div-div-dl-dt-a-dd-span-a-span-span-a-span-span-a-span-span-a-span-dl-dt-dd-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-span-a-p-dd-i-i-dd-span-span-i-i-span-a-i-dl-dt-i-i-span-span-i-i-span-span-a-p-i-span-dd-div-a-div-a-a-a-a-a-ul-li-a-li-a-li-a-li-a-span-span-li-a-li-a-i-a-a-i-a-div-div-div-span-a-div-span-dd-a-div-section-section-div-aside-dl-div-dl-div-a-p-p-a-p-p-a-p-p-a-p-p-div-div-div-img-div-section-link-div-div-a-a-a-a-a-a-a-style-div' score: '0.8' name: '链接失效页面'

1、找到一堆404页面,得到其结构、title,响应码特征,丰富我们的上述配置
如何快速获取大量的404页面?可以找到一堆域名,然后添加一系列后缀(绝不可能存在的),得到的页面大概率就是404页面
2、对页面内容做智能解析提取,进而得到内容区的标题和正文,再进行进一步的分析。

原文链接:https://xz.aliyun.com/t/12603

网络摘文,本文作者:15h,如若转载,请注明出处:https://www.15cov.cn/2023/08/27/安全开发之404页面检测/

发表评论

邮箱地址不会被公开。 必填项已用*标注

网站地图