[100] 这样的 SQL 语句应该如何写 ? (引号等非法字符的问题)

celas 2006-10-25 03:34:01
SQL 的作用是按多个用户名搜索这些用户的信息, 如:

SELECT * FROM user WHERE username IN ('username1', 'username2', .....)

关键是括号中的 username1, username2 等变量都可能出现引号及其它引起麻烦的字符, 应该如何过滤 ?

难道用 foreach 循环 + SqlParameters 一个一个赋值 ?


ps: 以前开发 PHP / MySQL, 有一个 addslashes 函数可以过滤转义字符, .NET 应该怎么办.
...全文
115 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
潜水员2099 2006-10-25
  • 打赏
  • 举报
回复
Code Sample:
public class SafeSql
{
public SafeSql(){}
public static string AddCheckQuotationMarks(string input)
{
string ret = input.Replace("'", "''");
return string.Concat("'", ret, "'");
}
}
scow 2006-10-25
  • 打赏
  • 举报
回复
记得SET QUOTED_IDENTIFIER ON
Eddie005 2006-10-25
  • 打赏
  • 举报
回复
1. 把单引号替换成双引号, 引号是没问题了, 会不会有其他字符出问题 ?
======只有单引号会引起问题,除此之外,'..这里可以包含任何字符..'

2. 用 SqlParameter, 如果 IN 中的参量很多 (比如上千个), .NET 内部 SQL 语句生成的效率怎么样 ? (不是执行的效率)
======没问题,效率不用担心
aafshzj 2006-10-25
  • 打赏
  • 举报
回复

2. 用 SqlParameter, 如果 IN 中的参量很多 (比如上千个), .NET 内部 SQL 语句生成的效率怎么样 ? (不是执行的效率)

不会比你生成字符串差。
celas 2006-10-25
  • 打赏
  • 举报
回复
呃。。。 上面都是 5 个裤衩以上的牛人阿

5555,为了我这个弱智问题。。

感动,感动。。。。
aafshzj 2006-10-25
  • 打赏
  • 举报
回复
实际上所有常见的Sql Injiection都是以单引号作为根本手段的,只要把每一个单引号变成两个单引号,这个问题就解决了。
celas 2006-10-25
  • 打赏
  • 举报
回复
呵呵, 牛人回帖. 谢谢 Eddie005

由于对 SQL SERVER 的语法理解不深, 这里还有两个疑问:

1. 把单引号替换成双引号, 引号是没问题了, 会不会有其他字符出问题 ?

2. 用 SqlParameter, 如果 IN 中的参量很多 (比如上千个), .NET 内部 SQL 语句生成的效率怎么样 ? (不是执行的效率)

谢谢!
aafshzj 2006-10-25
  • 打赏
  • 举报
回复
str = str.Replace(",", "''");

或者就是用参数传。能用参数就用参数是最好的习惯。
cm8983 2006-10-25
  • 打赏
  • 举报
回复
可以拼接成一个字符串,用函数把该字符串分离.到SQL论坛里类似的问题太多了.
fxqyyzg 2006-10-25
  • 打赏
  • 举报
回复
也可以转化,把‘转为别的,比如一串字符,显示时候再转换了
Eddie005 2006-10-25
  • 打赏
  • 举报
回复
在数据库里,两个连续的单引号转义为一个单引号,即:
SELECT * FROM user WHERE username IN ('user''name1', 'user''name2', .....)
就可以搜索用户名为user'name1 和 user'name2的数据
Eddie005 2006-10-25
  • 打赏
  • 举报
回复
将一个单引号替换成两个连续的单引号

用 foreach 循环 + SqlParameters 一个一个赋值 其实是正道~
相关推荐
发帖
.NET社区

6.1w+

社区成员

.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
帖子事件
创建了帖子
2006-10-25 03:34
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。