Это плохое регулярное выражение.
^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)$
Давайте сделаем это по частям.
([a-zA-Z]:)
Для этого требуется, чтобы путь к файлу начинался с буквы диска, например C:
, d:
и т. Д.
(\\{2}\w+)\$?)
\\{2}
означает, что обратная косая черта повторяется дважды (обратите внимание, что \
необходимо экранировать), затем идут буквенно-цифровые цифры (\w+
), а затем, возможно, знак доллара (\$?
). Это основная часть пути UNC.
([a-zA-Z]:)|(\\{2}\w+)\$?)
|
означает «или». Так что либо начинается с буквы диска или пути UNC. Поздравляем с выгонкой не-Windows пользователей.
(\\(\w[\w].*))
Это должна быть часть пути каталога, но на самом деле это 2 алфавитно-цифровых символа, за которыми следует что угодно, кроме новых строк (.*
), например, \ab!@#*(#$*)
.
Правильное регулярное выражение для этой части должно быть (?:\\\w+)+
(.jpg|.JPG|.gif|.GIF)$
Это означает, что последние 3 символа пути должны быть jpg
, JPG
, gif
или GIF
. Обратите внимание, что .
- это , а не точка, но соответствует всему, кроме \n
, поэтому имя файла, например haha.abcgif
или malicious.exe\0gif
, будет проходить.
Правильное регулярное выражение для этой части должно быть \.(?:jpg|JPG|gif|GIF)$
Вместе
^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))(.jpg|.JPG|.gif|.GIF)$
будет соответствовать
D:\foo.jpg
\\remote$\dummy\..\C:\Windows\System32\Logo.gif
C:\Windows\System32\cmd.exe;--gif
и потерпит неудачу
/home/user/pictures/myself.jpg
C:\a.jpg
C:\d\e.jpg
Правильное регулярное выражение /\.(?:jpg|gif)$/i
и проверьте, действительно ли загруженный файл является изображением на стороне сервера .