在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?

Posted

技术标签:

【中文标题】在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?【英文标题】:Is it safe to pass xml document as an parameter of store procedure in SqlServer?在 Sql Server 中将 xml 文档作为存储过程的参数传递是否安全? 【发布时间】:2016-05-29 02:16:02 【问题描述】:

在将 xml 传递到存储过程(使用 c#)之前,我需要做一些额外的检查吗?

【问题讨论】:

这取决于你的场景。你到底想用这个 xml 做什么,你期望什么样的漏洞? 我是初学者,对 sql server 中的安全问题不太了解。但我想创建一个教育应用程序,用户可以在其中从 xml 文档中的本地数据库导出统计数据,反之亦然 - 将其从 xml 导入数据库。在这种情况下我需要考虑这个问题吗?对不起我的英语。 我不会担心您描述的场景中可能存在的安全问题。将 DB 信息保存到 xml 以及解析这个 xml 和修改 DB 数据可以被认为是不需要任何额外检查的安全操作。 @OleksandrMatviienko,您说“谢谢”真是太好了,但是,由于您是 SO 新手,请允许我一个提示:请注意一个事实,所有专业人士都给予SO上的答案渴望获得声誉积分。 Please read this: someone-answers。谢谢! 如有疑问,请始终为每个变量使用参数。这可能需要更多时间,但如果有人利用漏洞,可能会花费更多时间、精力和金钱。 【参考方案1】:

不知道你到底要做什么,只有一般的想法:

将 XML 从 C# 应用程序传递到存储过程意味着传输字符串。此字符串在进入您的 SP 的那一刻被转换为 XML(如果参数声明为 XML)。只要您的 XML 有效,这应该可以工作。

1) 如果您想确保此字符串不会在途中更改:您可以在您的应用程序中创建一个哈希码并在您的 SP 中检查此哈希码。此哈希码可能嵌入到 XML 中,或作为附加参数传输或在额外进程中与 ID 一起传输以获得额外的安全性。

2) 您要确保 XML 是有效的:这不需要额外的努力,只要您在 C# 中使用“真正的”XML 对象并且不使用 StringBuilder 或类似的方法创建 XML。

3) 您要确保您的 XML 遵循专用模式:使用 XSD 检查您的 XML 在结构上是否满足“合同”。您可以在您的应用程序或 SQL Server 或两者中执行此操作。

【讨论】:

这里没有字符串:using (var reader = myXml.CreateReader()) command.Parameters.Add("@xmlParam", SqlDbType.Xml).Value = new SqlXml(reader); @adrianm 我很确定(但不是 100%),XML 在 c# 端是类型安全的,在 SP 中是类型安全的,但在中间被序列化为字符串。我不会假设对传递的字符串的更改已被识别。如果从具有 XML 列的表中创建类型化 DataSet,则 c# DataSet 中的类型为 string。正如我所说:我相当确定,XML 是介于两者之间的字符串 ... 你可以100%确定,它在调用中被序列化为SQLCommand对象生成的字符串,你会看到:declare @p1 xml; set @p1=convert(xml,N'<a></a>'); exec sp_Whatever @p1实际发送到服务器,转换后的XML字符串呼叫正确' 转义。格式错误的 XML 在这里生成一个异常(convert() 失败),甚至在它到达 sp 之前。 @AlexK。 Thx,我没想到会发生其他事情......这是一个 - 相当学术 - 对安全问题的思考。 OP 在评论中说,这就是他想知道的。如果有人在应用程序和 SP 之间更改序列化 XML(并且它是一种字符串),我不会认为这是公认的。这就是为什么我建议创建一个哈希码来检查 XML 是否在这里和那里相同。

以上是关于在 Sql Server 中将 xml 文档作为存储过程的参数传递是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

在sql server中将xml列值编码为xml

在 SQL Server 中将数据转换为 XML 时出错

在 SQL 中将 XML 文档转换为表格数据集的有效方法,因为随着 xml 的增长,交叉应用 xml 查询的性能呈指数级下降

如何在 SQL Server 2005 中将随机数作为列返回?

在 Sql Server 中将集合作为参数传递时使用 IN 子句

sql server 中text的字段怎么存“字很多的文档”,直接复制粘贴?粘完后,为啥后面的字看不到?