参数 vs 字符串插值

8
使用参数的优势是什么,与字符串插值相比?
这个: SELECT * FROM dbo.Posts WHERE Author = @p0", userSuppliedAuthor; 比这个: $@SELECT * FROM dbo.Posts WHERE Author = {userSuppliedAuthor}"; 更好吗?

3
插值(Interpolation)==> SQL注入。不要这样做。查看 Bobby Tables - Panagiotis Kanavos
@PanagiotisKanavos 除了 SQL 注入之外还有其他的吗? - cikatomo
@cikatomo 经常碰到日期和数字转换问题,混乱的非英文文本。其实使用参数(如Dapper)更容易。con.Query<Posts>("select * from Posts where Author=@author",new {autthor=someAuthor});" - Panagiotis Kanavos
2个回答

16

字符串插值只是一种格式化字符串的语法糖。它不能保护你免受SQL注入攻击。你应该使用SQL参数来为查询提供值。

考虑一下 - 如果userSuppliedAuthor等于

'Bob' OR 1 = 1

甚至更好

'Bob'; DROP TABLE Users;

更多阅读 SQL 注入


5
或者 "'Bob'; DROP TABLE dbo.Posts;" - Tim Schmelter
@TimSchmelter 是的,我试图添加这样的示例,但编辑器不允许将DROP users表插入答案正文中 :) - Sergey Berezovskiy
1
@farzin-kanzi 对关键字进行消毒只是你所面临问题中最不重要的一部分。还有许多其他问题可能会被注入到你的应用程序中,导致其行为不一致(例如,“Bob”或作者<>“”)。此外,如果你采取消毒措施,你还必须对文本进行消毒(例如撇号等)。 - Eric
谢谢Eric,我打算删除我的评论。 - Farzin Kanzi
除了 SQL 注入之外,还有其他的异议吗? - cikatomo

2
除了Sergey提到的SQL注入问题之外,您可能会遇到包含某些字符的完全有效字符串的问题,例如“'”,“.”和“@”字符,这些字符对于SQL有意义并且需要处理。最好参数化查询以防止这些问题,不仅在直接从用户输入进行注入时,甚至像电子邮件地址或标题中的所有格等简单事情也是如此。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接