匹配的HTML定位符,显示与其href不同的URL

问题描述

我们是网络钓鱼攻击的受害者,我们希望加强我们的Postfix垃圾邮件过滤器。

我们要检测在URL周围包含锚点(<a>)但在href中定位到另一个URL的电子邮件正文。

以下是示例列表:

VALID
<a href="www.google.com">www.google.com</a>
<a href="www.google.com">google.com</a>
<a href="https://www.google.com" id="someId">google.com</a>
<a id="ID" href="https://google.com">google.com</a>

INVALID
<a href="www.malicIoUs.com">www.google.com</a>
<a href="www.malicIoUs.com">google.com</a>
<a href="www.malicIoUs.com" id="someId">google.com</a>
<a id="ID" href="https://google.evil.com">google.com</a>

https://regex101.com/r/kZUN84/1

我的计划是创建一个包含域+ TLD的命名捕获组(即“ https://www.google.com”的“ google.com”),然后检查定位标记中的文本是否与之匹配。如果没有,则可能是垃圾邮件

正如您在regex101链接中看到的那样,我相信我必须使用捕获组和否定的前瞻性,但是我仍在努力编写它……(而且我知道 URL验证可能很棘手。 )

任何建议检查正则表达式是否匹配其子字符串之一?

解决方法

我可以提出这个问题,它与所有网络钓鱼类型匹配,而不是有效的。但是我认为这样容易产生误报:

  • <a id="ID" href="https://google.com">google</a>
  • <a id="ID" href="https://google.com">link here</a>

这是正则表达式:

<a\b\s*(?:.*)?(?=\bhref=)href="((?:https?:\/\/)?(?:www\.)?)?+(?'href'(?'start'[^"])[^"]+)"([^>]*)?>((?:https?:\/\/)?(?:www\.)?)?+(((?!\k'href')(?=\k'start'))|(?!\k'href'))([^<]+)(<\/a>)

我需要 start 命名组才能在第二个链接中获得可能的位置,因为从那里我可以检查整个 href 组。并且 href 中的第一个字符可能会丢失,因此这就是我放置|(?!\k'href')的原因。

https://regex101.com/r/kZUN84/7(某些捕获组仅在regex101中用于着色)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...