我想加密日志中的 JWT token ,为此,我配置了winston.js 来集中此功能。例如,如果有人想要记录 JS 对象或字符串,他们只需记录它,如果该字符串包含 token ,它将自动加密。
我正在使用下面的正则表达式:
const JWT_TOKEN_REGEX = /[A-Za-z0-9-_=]+\.[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*/g;
但是,当我从请求中获取查询字符串时
my-panel?issueId=10060&type=left&xdm_e=https%3A%2F%2Ftanriverdi.furkan.net&xdm_c=channel-abc.plugin.xyz__abc-issue-content-panel-3543924933333691153&cp=&xdm_deprecated_addon_key_do_not_use=abc.plugin.xyz&lic=none&cv=1001.0.0-SNAPSHOT&jwt=eyJ0eXAiOiJKV1QiOiJIUzI1NiJ9.eyJzdWIiOiI2MjQ2OWI5MDRmZTAxZDAwNmJhNzVjNDMiLCJxc2giOiI3YWE1YWVjN2NhOTM4Yzc0NmRmMmJkNmY2MTJiOTU4MmY5MzkxNWI1MzQzYmM1YTk4IiwiaXNzIjoiMzJmMTg4OTMtNzhkNi0zZmJiLWI3NzgtNmQ2OWU3YTU3NWM5IiwiY29udGV4dCI6e30sImV4cCI6MTY2NjYwMjkxMywiaWF0IjoxNjY2NjAyMDEzfQ.CpI-BZfqOM7Rmidv8e2L8G-rENSELnfEP96w
,所有带两个点的字符串都会被加密。
如何仅解析 JWT token 值?它们并不总是出现在查询字符串中,也不必以 jwt=
或类似内容开头。
我尝试自定义正则表达式,例如
every capturing group must contain at least 1 uppercase letter, 1 lowercase letter and 1 digit.
我无法成功过滤 JWT。
非常感谢任何建议!
最佳答案
您可以在规则中添加第一段和第二段必须以 eyJ
开头,因为 JWT 的 header 和负载是 Base64URL 编码的 JSON,并以 {"
开头>,即 Base64URL 中的 eyJ
。在下面的示例中,我还删除了最后一个 .
之后的 ?
,因此它必须始终为 3由 .
分隔的段。也不需要 =
,因为 JWT 使用 Base64URL 编码而不进行填充:
const isJWT = (jwt) => {
return String(jwt)
.match(/eyJ[A-Za-z0-9-_]+\.eyJ[A-Za-z0-9-_]+\.[A-Za-z0-9-_.+/]*/g);
};
const jwt = "eyJ0eXAiOiJKV1QiOiJIUzI1NiJ9.eyJzdWIiOiI2MjQ2OWI5MDRmZTAxZDAwNmJhNzVjNDMiLCJxc2giOiI3YWE1YWVjN2NhOTM4Yzc0NmRmMmJkNmY2MTJiOTU4MmY5MzkxNWI1MzQzYmM1YTk4IiwiaXNzIjoiMzJmMTg4OTMtNzhkNi0zZmJiLWI3NzgtNmQ2OWU3YTU3NWM5IiwiY29udGV4dCI6e30sImV4cCI6MTY2NjYwMjkxMywiaWF0IjoxNjY2NjAyMDEzfQ.CpI-BZfqOM7Rmidv8e2L8G-rENSELnfEP96w"
if (isJWT(jwt)) console.log("it's a JWT!");
关于javascript - JavaScript 中更准确的 JWT token 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74180282/