Classic ASP读取SQL Server存储的BLOB格式PNG图片显示异常求助
问题原因及解决方法
核心问题1:BLOB字段存储的是Base64编码内容,而非原始PNG二进制
你贴出的存储数据片段为标准Base64编码格式,直接使用Response.BinaryWrite输出编码字符串无法被浏览器识别为有效图片,需要先解码为二进制流再输出。
核心问题2:存在多余输出破坏二进制流
ASP页面、引入的SQLConnect.asp文件中如果存在额外的空格、换行、隐式输出内容,都会污染PNG二进制数据,导致图片解析失败。
核心问题3:SQL逻辑存在注入风险,且无数据存在性校验
直接拼接查询字符串存在SQL注入风险,且未判断查询结果是否为空,空输出会触发浏览器显示默认损坏图标。
修复后的代码示例
<% ' 页面前后不要留任何空行、空格 Option Explicit Response.Expires = 0 Response.Buffer = TRUE Response.Clear <!--#include file="SQLConnect.asp"--> Dim FN, sql1, rs1, base64Str, binData, cmd FN = Request.QueryString("FN") ' 校验参数非空 If FN = "" Then Response.Status = "400 Bad Request" Response.End End If ' 参数化查询避免注入 Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = conn cmd.CommandText = "SELECT BLOB FROM [Database].[dbo].[Images] WHERE filename = ?" cmd.Parameters.Append cmd.CreateParameter("@fn", 200, 1, 255, FN) Set rs1 = cmd.Execute() If rs1.EOF Then Response.Status = "404 Not Found" rs1.Close Set rs1 = Nothing Set cmd = Nothing conn.Close Set conn = Nothing Response.End End If ' 若BLOB存的是Base64,先解码;如果存的是原始二进制直接跳过解码步骤 base64Str = rs1("BLOB").Value binData = Base64Decode(base64Str) Response.ContentType = "image/png" Response.BinaryWrite binData ' 资源释放 rs1.Close Set rs1 = Nothing Set cmd = Nothing conn.Close Set conn = Nothing ' Base64解码函数 Function Base64Decode(base64Str) Dim xml, node Set xml = Server.CreateObject("MSXML2.DOMDocument.6.0") Set node = xml.CreateElement("base64") node.DataType = "bin.base64" node.Text = base64Str Base64Decode = node.NodeTypedValue Set node = Nothing Set xml = Nothing End Function %>
额外检查项
- 确认存储PNG时是否做了编码处理,如果存的就是原始二进制,删除代码中Base64解码相关逻辑,直接输出
rs1("BLOB")即可 - 检查
SQLConnect.asp文件末尾是否有空行,删除所有非代码的输出内容 - 测试时直接访问
PIC.ASP?FN=你的文件名,按F12看网络请求返回的Content-Type是否为image/png,返回内容长度是否和原PNG文件大小一致
内容的提问来源于stack exchange,提问作者Juliemac
相关产品推荐
相关产品推荐

