IIS - PATH_TRANSLATED имеет дополнительные пробелы, добавленные к нему, вызывая ошибку подозрительного физического пути - PullRequest
1 голос
/ 17 мая 2019

У меня есть приложение .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" />

Что не позволит окнам выдавать ошибку при добавлении пробелов, но я бы лучше остановилсяпробелы добавляются в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...