IE从SP2开始进行了MIME嗅探的功能。以前的浏览器都是通过Content-Type来判断Resoponse流是何种类型的内容,进而调用不用的处理程序进行处理,如text/html表明接受的html代码,需要做html页面渲染,text/jpeg表明接受的图片文件,需要对接受到的数据流调用处理jpeg格式流的处理程序。
IE则在此基础上增加了对MIME的嗅探功能,不仅仅根据Content-Type来判断,而且会根据Response流的内容来进行判断。加入Content-Type的值是text/plain,在非IE浏览器中,text/plain表明的是普通的文本,浏览器只需要把内容展示出来就可以了。但是在IE中,如果Response的内容是类似如下的内容:
则IE执行MIME嗅探后,会判定其内容是text/html类型,此时就会执行html的渲染逻辑,在浏览器中弹出/xss对话框。
IE的此特性可以得出,在Web程序中,返回的Response一定要具有正确的Content-Type值,避免IE的“聪明”。
问题是:如果我们的确需要给用户提供一个普通的文件进行下载,该文件的内容含有如上格式的html相关字符,此时Content-Type的值是需要设置成text/plain(因为这个文件的确是plain的),该怎么办呢?
解决方式是:使用Content-disposition.
Content-disposition格式:
"content-disposition","attachment; filename=fname.ext"
在filename=的后面写上文件名(如foo.txt),此时浏览器会直接弹出对话框提示用户是否保存此文件。
IE则在此基础上增加了对MIME的嗅探功能,不仅仅根据Content-Type来判断,而且会根据Response流的内容来进行判断。加入Content-Type的值是text/plain,在非IE浏览器中,text/plain表明的是普通的文本,浏览器只需要把内容展示出来就可以了。但是在IE中,如果Response的内容是类似如下的内容:
- <html>
- <script>
- alert(/xss/);
- </script>
- </html>
IE的此特性可以得出,在Web程序中,返回的Response一定要具有正确的Content-Type值,避免IE的“聪明”。
问题是:如果我们的确需要给用户提供一个普通的文件进行下载,该文件的内容含有如上格式的html相关字符,此时Content-Type的值是需要设置成text/plain(因为这个文件的确是plain的),该怎么办呢?
解决方式是:使用Content-disposition.
Content-disposition格式:
"content-disposition","attachment; filename=fname.ext"
在filename=的后面写上文件名(如foo.txt),此时浏览器会直接弹出对话框提示用户是否保存此文件。