Javascript 对于不受信任的字符串,regex uuid验证器是否安全

Javascript 对于不受信任的字符串,regex uuid验证器是否安全,javascript,uuid,denial-of-service,Javascript,Uuid,Denial Of Service,我正在使用一个可以验证字符串是否为UUID的函数。 我害怕。此正则表达式是否暴露于重做攻击?也许还有其他我没想到的袭击 /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i 目前,我在将字符串传递给函数之前对其进行切片,但这很麻烦,可读性也较差: const _ = require('lodash'); flow(

我正在使用一个可以验证字符串是否为UUID的函数。
我害怕。此正则表达式是否暴露于重做攻击?也许还有其他我没想到的袭击

/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i
目前,我在将字符串传递给函数之前对其进行切片,但这很麻烦,可读性也较差:

const _ = require('lodash');
flow(s => s.slice(0, 36), console.log)('uuid')

使用此模式进行重做的可能性为零—它不包含任何变量重复,也不包含重复内部的任何交替。这是一个非常简单的模式,可以验证每个字符并继续下一个字符。

使用此模式进行重做的可能性为零-它不包含任何变量重复,也不包含重复内部的任何交替。这是一个非常简单的模式,可以验证每个字符并继续下一个字符。

您链接的OWASP文章有您的答案。如果模式在重复组中包含重复,则该模式被视为“邪恶”(易受重做攻击)

邪恶正则表达式 如果一个正则表达式可以被手工输入卡住,它就被称为“邪恶”

邪恶的正则表达式模式包含:

  • 重复分组
  • 在重复组内:
    • 重复
    • 重叠交替


您的模式在重复中没有分组,因此不易受攻击。也就是说,如果您知道您希望在搜索的字符串的前36个字符中包含UUID,那么在尝试匹配之前修剪字符串会有一个高效的好处。我不知道拼接是否足够难阅读,以保证额外的时间搜索字符串,您必须自己判断。

您链接的OWASP文章有您的答案。如果模式在重复组中包含重复,则该模式被视为“邪恶”(易受重做攻击)

邪恶正则表达式 如果一个正则表达式可以被手工输入卡住,它就被称为“邪恶”

邪恶的正则表达式模式包含:

  • 重复分组
  • 在重复组内:
    • 重复
    • 重叠交替

您的模式在重复中没有分组,因此不易受攻击。也就是说,如果您知道您希望在搜索的字符串的前36个字符中包含UUID,那么在尝试匹配之前修剪字符串会有一个高效的好处。我不知道拼接是否足够难读,以保证额外的时间搜索你的字符串,你必须自己判断