У меня есть приложение .NET 4.7.2, работающее на Windows Server 2016 на IIS.Когда запрашивается статическое изображение, такое как /images/generic/facebook.png
, я иногда получаю System.Web.HttpException
in System.Web.Util.FileUtil#CheckSuspiciousPhysicalPath
.
Я не могу воспроизвести нигде, кроме как вживую, хотя наша среда подготовки и тестированияидентичны.Я думаю, что это из-за его прерывистой природы, а не аспекта ошибки.
В параметрах сервера у нас есть:
"PATH_INFO": "/images/generic/facebook.png",
"PATH_TRANSLATED": "D:\\website\\images\\generic\\facebook.png ",
PATH_INFO
- это запрашиваемый файл, аPATH_TRANSLATED
- это путь на жестком диске. Обратите внимание на количество пробелов, добавленных в конец .Это делает путь недопустимым для окон, и поэтому путь кажется неверным.
Если я добавлю параметры запроса, подобные вектору атаки, к facebook.png
, то они будут удалены.
Так как этовозникающие в переменных IIS PATH, я предполагаю, что что-то не так с конфигурацией IIS, что мы делаем полностью через web.config.
web.config
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="DENY" />
<add name="X-Content-Type-Options" value="nosniff" />
<add name="X-Xss-Protection" value="1; mode=block" />
<add name="Content-Security-Policy" value="default-src 'self' 'unsafe-inline'; font-src 'self' https://maxcdn.bootstrapcdn.com; style-src 'self' blob: 'unsafe-inline' https://maxcdn.bootstrapcdn.com; script-src 'unsafe-inline' 'unsafe-eval' 'self' https://www.google-analytics.com https://www.googletagmanager.com; img-src 'self' https://www.google-analytics.com;" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="RoleManager" />
</modules>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
</httpErrors>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<rewrite>
<rules>
<clear />
<rule name="Remove www" stopProcessing="false">
<match url="(.*)" negate="false" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)$" />
</conditions>
<action type="Redirect" url="http://{C:1}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
<rule name="Force HTTPS" enabled="true" stopProcessing="false">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
<outboundRules rewriteBeforeCache="true">
<rule name="Remove Server header">
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
<rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
<match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" ignoreCase="true" />
</conditions>
<action type="Rewrite" value="max-age=31536000" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
Наименьшее желаемое решение
Похоже, что добавляется одно решение:
<httpRuntime relaxedUrlToFileSystemMapping="true" />
Что не позволит окнам выдавать ошибку при добавлении пробелов, но я бы лучше остановилсяпробелы добавляются в первую очередь.