Microsoft KB Archive/318176

= SSI Output Disappears After You Apply Security Patches =

Article ID: 318176

Article Last Modified on 11/21/2006

-

APPLIES TO


 * Microsoft Internet Information Services 5.0
 * Microsoft Internet Information Server 4.0

-



This article was previously published under Q318176



We strongly recommend that all users upgrade to Microsoft Internet Information Services (IIS) version 6.0 running on Microsoft Windows Server 2003. IIS 6.0 significantly increases Web infrastructure security. For more information about IIS security-related topics, visit the following Microsoft Web site:

http://www.microsoft.com/technet/security/prodtech/IIS.mspx



SYMPTOMS
When you execute a server-side include (SSI) program by using the  command on a server that is running either Microsoft Windows NT 4.0 with Service Pack 4 (SP4) or later applied or Microsoft Windows 2000 with Service Pack 2 (SP2) or later applied, the output of the program does not appear on the page. If you run the same program on an unpatched server, the output appears as expected.



CAUSE
After you apply these specified service packs, Internet Information Services (IIS) expects any SSI program that is executed by using the  command to follow the Common Gateway Interface (CGI) specification. This specification requires CGI programs to print a Content-Type HTTP header before any other output. IIS silently ignores this header and removes it from the final program output that it displays on the page. If the SSI program does not include this header, IIS executes the program but does not display any of its output. This is a change from the behavior of previous versions of Windows, which do not require these headers and which display any included HTTP headers on the page before the rest of the output from the SSI program.



RESOLUTION
You can make the output appear in one of two ways:  Execute the program by using the ' command instead of the ' command. -or-

 Rewrite the program to print the following line, followed by two new lines, before any other output:

Content-type: text/html





STATUS
This behavior is by design.



MORE INFORMATION
To enable SSIs, follow these steps:  Start the Internet Service Manager (ISM), which loads the IIS snap-in for the Microsoft Management Console (MMC). In the MMC, double-click your computer name in the left pane.</li> Double-click the Web site for which you want to enable SSI.</li> Right-click the virtual directory that will contain your SSI-enabled files. To enable SSI for the home directory of a Web site, right-click the Web site.</li> Click Properties, and then click the Home Directory tab.</li> Under Execute permissions, click to select Scripts and Executables.</li> Click OK. Make sure to select any directories that contain SSI-enabled files in the Inheritance Overrides screen.For additional information about how to enable the command, click the article number below to view the article in the Microsoft Knowledge Base:

233969 SSIEnableCmdDirective Is Set to FALSE by Default

</li></ol>

Steps to Reproduce the Behavior
 Enable server-side includes for the home directory of your default Web site.</li>  Compile the following C program on an unpatched Windows NT 4.0 or Windows 2000 server: int main(int argc, char **argv) { printf(&quot;Hello World\n&quot;);
 * 1) include <stdio.h>

} </li> Name the executable file Helloworld.exe, and then put the file in the root directory of your Web server. By default, this directory is C:\Inetpub\Wwwroot.</li>  Create the following SSI-enabled HTML page, and then save the page as Ssitest.shtm in the root directory of your Web server: <HTML><BODY> Exec cmd: <BR> Exec cgi: </BODY></HTML> </li>  Browse to http://localhost/ssitest.shtm on a computer that is running Windows NT 4.0 Service Pack 3 (SP3) or earlier or Windows 2000 Service Pack 1 (SP1) or earlier. You see the following: Exec cmd: Hello World Exec cgi: Hello World </li> Apply Windows NT 4.0 SP4 or later or Windows 2000 SP2 or later to the computer.</li>  Browse to http://localhost/ssitest.shtm again. You now see the following: Exec cmd: Hello World Exec cgi: </li>  Modify the code for Helloworld.exe to print a Content-Type header first, and then recompile the file: int main(int argc, char **argv) { printf(&quot;Content-type: text/html\n&quot;); printf(&quot;Hello World\n&quot;);
 * 1) include <stdio.h>

} </li>  Reload http://localhost/ssitest.shtm on a computer that is running Windows NT 4.0 SP4 or later or Windows 2000 SP2 or later. You now see the following: Exec cmd: Content-type: text/html Hello World Exec cgi: Hello World Note that unlike the ' command, the ' command does not remove any CGI headers from the output. </li></ol>

<div class="references_section">