Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5d5ebd4

Browse files
committed
introducing regex caching mechanism
1 parent 14cab85 commit 5d5ebd4

4 files changed

Lines changed: 24 additions & 10 deletions

File tree

lib/core/common.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@
7070
from lib.core.settings import ACCESS_ALIASES
7171
from lib.core.settings import FIREBIRD_ALIASES
7272

73+
__compiledRegularExpressions = {}
74+
7375
def paramToDict(place, parameters=None):
7476
"""
7577
Split the parameters into names and values, check if these parameters
@@ -1222,3 +1224,11 @@ def getGoodSamaritanCharsets(part, prevValue, originalCharset):
12221224
return predictedCharset, otherCharset
12231225
else:
12241226
return None, originalTable
1227+
1228+
def getCompiledRegex(regex):
1229+
if regex in __compiledRegularExpressions:
1230+
return __compiledRegularExpressions[regex]
1231+
else:
1232+
retVal = re.compile(regex)
1233+
__compiledRegularExpressions[regex] = retVal
1234+
return retVal

lib/parse/banner.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from xml.sax.handler import ContentHandler
2828

2929
from lib.core.common import checkFile
30+
from lib.core.common import getCompiledRegex
3031
from lib.core.common import parseXmlFile
3132
from lib.core.common import sanitizeStr
3233
from lib.core.data import kb
@@ -76,7 +77,8 @@ def characters(self, data):
7677
def endElement(self, name):
7778
if name == "signature":
7879
for version in (self.__version, self.__versionAlt):
79-
if version and re.search(" %s[\.\ ]+" % version, self.__banner):
80+
regObj = getCompiledRegex(" %s[\.\ ]+" % version)
81+
if version and regObj.search(self.__banner):
8082
self.__feedInfo("dbmsRelease", self.__release)
8183
self.__feedInfo("dbmsVersion", self.__version)
8284
self.__feedInfo("dbmsServicePack", self.__servicePack)
@@ -89,8 +91,9 @@ def endElement(self, name):
8991
elif name == "version":
9092
self.__inVersion = False
9193
self.__version = self.__version.replace(" ", "")
92-
93-
match = re.search(r"\A(?P<major>\d+)\.00\.(?P<build>\d+)\Z", self.__version)
94+
95+
regObj = getCompiledRegex(r"\A(?P<major>\d+)\.00\.(?P<build>\d+)\Z")
96+
match = regObj.search(self.__version)
9497
self.__versionAlt = "%s.0.%s.0" % (match.group('major'), match.group('build')) if match else None
9598

9699
elif name == "servicepack":

lib/request/basic.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import StringIO
2929
import zlib
3030

31+
from lib.core.common import getCompiledRegex
3132
from lib.core.common import isWindowsDriveLetterPath
3233
from lib.core.common import posixToNtSlashes
3334
from lib.core.common import urlEncodeCookieValues
@@ -36,9 +37,6 @@
3637
from lib.parse.headers import headersParser
3738
from lib.parse.html import htmlParser
3839

39-
__absFilePathsRegExp = ( r" in <b>(?P<result>.*?)</b> on line", r"(?:>|\s)(?P<result>[A-Za-z]:[\\/][\w.\\/]*)", r"(?:>|\s)(?P<result>/\w[/\w.]+)" )
40-
__absFilePathsRegObj = [re.compile(absFilePathRegExp) for absFilePathRegExp in __absFilePathsRegExp]
41-
4240
def forgeHeaders(cookie, ua):
4341
"""
4442
Prepare HTTP Cookie and HTTP User-Agent headers to use when performing
@@ -78,8 +76,9 @@ def parseResponse(page, headers):
7876
# NOTE: this regular expression works if the remote web application
7977
# is written in PHP and debug/error messages are enabled.
8078

81-
for reobj in __absFilePathsRegObj:
82-
for match in reobj.finditer(page):
79+
for regex in ( r" in <b>(?P<result>.*?)</b> on line", r"(?:>|\s)(?P<result>[A-Za-z]:[\\/][\w.\\/]*)", r"(?:>|\s)(?P<result>/\w[/\w.]+)" ):
80+
regObj = getCompiledRegex(regex)
81+
for match in regObj.finditer(page):
8382
absFilePath = match.group("result").strip()
8483
page = page.replace(absFilePath, "")
8584

lib/utils/detection.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import re, sre_constants
2525
from xml.dom import minidom
2626

27+
from lib.core.common import getCompiledRegex
2728
from lib.core.data import paths
2829
from lib.core.data import logger
2930

@@ -50,12 +51,13 @@ def checkPayload(string):
5051
rules = []
5152
for xmlrule in xmlrules.getElementsByTagName("filter"):
5253
try:
53-
rule = re.compile(xmlrule.getElementsByTagName('rule')[0].childNodes[0].nodeValue)
54+
rule = xmlrule.getElementsByTagName('rule')[0].childNodes[0].nodeValue
5455
desc = __adjustGrammar(xmlrule.getElementsByTagName('description')[0].childNodes[0].nodeValue)
5556
rules.append((rule, desc))
5657
except sre_constants.error: #some issues with some regex expressions in Python 2.5
5758
pass
5859

5960
for rule, desc in rules:
60-
if rule.search(string, re.IGNORECASE):
61+
regObj = getCompiledRegex(rule)
62+
if regObj.search(string, re.IGNORECASE):
6163
logger.warn("highly probable IDS/IPS detection: '%s'" % desc)

0 commit comments

Comments
 (0)