CSDN-CSDN社区-MS-SQL Server-疑难问题

收藏 关于SQL 2005过滤非法字符的问题[问题点数:100,结帖人:MOTA]

  • MOTA
  • (YodFz·杭州)
  • 等 级:
  • 结帖率:
楼主发表于:2008-06-05 11:37:36
范例
用户提交: 枪as23!@#%$支
数据库 将过滤 枪(.*)支 这个词语
有多个过滤字符!!!!

请问存储过程如何写????

又或者用其他办法怎么做????


- -|
回复次数:18
  • roy_88用户头像
  • roy_88
  • (中国风)
  • 等 级:
  • 2

    4

#1楼 得分:1回复于:2008-06-05 11:38:45
- - 用個函數
  • ranzj用户头像
  • ranzj
  • (天鹅,在高过云层的地方,用翅翼)
  • 等 级:
#2楼 得分:1回复于:2008-06-05 11:40:22
正则表达式.
  • roy_88用户头像
  • roy_88
  • (中国风)
  • 等 级:
  • 2

    4

#3楼 得分:30回复于:2008-06-05 11:42:49
  • roy_88用户头像
  • roy_88
  • (中国风)
  • 等 级:
  • 2

    4

#4楼 得分:0回复于:2008-06-05 11:44:05
SQL code
create function F_Str(@Name nvarchar(100))
returns nvarchar(100)
as
begin
while patindex('%[枪(.*)]%',@Name)>0
	set @name=stuff(@Name,patindex('%[枪(.*)]%',@Name),1,'')
return @name
end
go
select dbo.F_Str('枪as23!@#%$支')


  • MOTA用户头像
  • MOTA
  • (YodFz·杭州)
  • 等 级:
#5楼 得分:0回复于:2008-06-05 11:44:54
有多个怎么办???????

汗 MS SQL 咋能用正则呢!!~~~
老土了
还是用2000版本!
今天刚换2005
  • roy_88用户头像
  • roy_88
  • (中国风)
  • 等 级:
  • 2

    4

#6楼 得分:10回复于:2008-06-05 11:45:36
'%[枪(.*)]%'--要過濾的子符,可用範圍如'[^0-9]'非0-9
#7楼 得分:5回复于:2008-06-05 11:45:42
一般是用程序来控制,这不是sql的强项.
  • MOTA用户头像
  • MOTA
  • (YodFz·杭州)
  • 等 级:
#8楼 得分:0回复于:2008-06-05 11:45:59
对了
比如用户提交的内容有非法字符了
那么我如何表现给用户呢???

楼上的兄弟似乎是直接替换成空了是吧?
  • MOTA用户头像
  • MOTA
  • (YodFz·杭州)
  • 等 级:
#9楼 得分:0回复于:2008-06-05 11:47:01
我也想用程序控制啊

BOSS说不好`~- -!
让我写存储过程1!!
简直就是浪费资源~~```
#10楼 得分:3回复于:2008-06-05 11:49:10
引用 8 楼 MOTA 的回复:
对了
比如用户提交的内容有非法字符了
那么我如何表现给用户呢???


所以最发用程序,sql里再加一层判断也可,但不要指望用sql server返回给客户端以提示有非法字符,太费资源.
  • MOTA用户头像
  • MOTA
  • (YodFz·杭州)
  • 等 级:
#11楼 得分:0回复于:2008-06-05 11:51:08
算了
我去说服一下BOSS
让他用程序吧--!

我连程序都写好了- -~
可怜的ASP程序- -~!~~~~~


'编写者:逸风
'编写日期:2008-6-4
'函数说明:对非法字符进行过滤
'这个函数将过滤所有非中文字符
function ClearString(str)
  dim re,str1,str2,i
  set re = new regexp
  re.Pattern = "^[\u4e00-\u9fa5\s\n\r\t]+$"
  for i=1 to len(str)
    str1 = mid(str,i,1)
    clearString = re.Test(str1)
    if clearString=true then
    str2 = str2&str1
    end if
  next
  str=str2
  ClearString = str
end function
'编写者:逸风
'编写日期:2008-6-4
'函数说明:对非法字符进行过滤
'这个函数将过滤所有非中文字符
function KillKey(str)
Key="枪支,走私,贩毒"
KeyArray=split(Key,",")
K=ubound(KeyArray)
for i=0 to K
if Instr(str,KeyArray(i)) then
response.Write(" <font color=red>您好,您输入的字符包含非法字符,请您仔细检查后再提交! </font> <a href='javascript:history.go(-1);'>返回 </a> <br/>非法字符:" & KeyArray(i))
response.End()
end if
next
end function
  • ranzj用户头像
  • ranzj
  • (天鹅,在高过云层的地方,用翅翼)
  • 等 级:
#12楼 得分:5回复于:2008-06-05 12:07:16
引用 5 楼 MOTA 的回复:
有多个怎么办???????

汗 MS SQL 咋能用正则呢!!~~~
老土了
还是用2000版本!
今天刚换2005



谁说 MS SQL 不能用正则?
  • ranzj用户头像
  • ranzj
  • (天鹅,在高过云层的地方,用翅翼)
  • 等 级:
#13楼 得分:30回复于:2008-06-05 12:09:01
  • ranzj用户头像
  • ranzj
  • (天鹅,在高过云层的地方,用翅翼)
  • 等 级:
#14楼 得分:0回复于:2008-06-05 12:09:56
SQL code


-- 自定义函数,用户可以调用这个函数判断指定的字符串是否符合正则表达式的规则.

CREATE FUNCTION dbo.find_regular_expression
 (
  @source varchar(5000),   --需要匹配的源字符串
  @regexp varchar(1000),  --正则表达式
  @ignorecase bit = 0  --是否区分大小写,默认为false
 )
RETURNS bit  --返回结果0-false,1-true
AS
 BEGIN

 --0(成功)或非零数字(失败),是由 OLE 自动化对象返回的 HRESULT 的整数值。
  DECLARE @hr integer 

--用于保存返回的对象令牌,以便之后对该对象进行操作
  DECLARE @objRegExp integer   DECLARE @objMatches integer

--保存结果
  DECLARE @results bit
  
/*
创建 OLE 对象实例,只有 sysadmin 固定服务器角色的成员才能执行 sp_OACreate,并确定机器中有VBScript.RegExp类库
*/
  EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
/*
以下三个分别是设置新建对象的三个属性。下面是'VBScript.RegExp'中常用的属性举例:
    Dim regEx,Match,Matches         '建立变量。
    Set regEx = New RegExp         '建立一般表达式。
    regEx.Pattern= patrn         '设置模式。
    regEx.IgnoreCase = True         '设置是否区分大小写。
    regEx.Global=True                             '设置全局可用性。
    set Matches=regEx.Execute(string)             '重复匹配集合
    RegExpTest = regEx.Execute(strng)      '执行搜索。
   for each match in matches                    '重复匹配集合
   RetStr=RetStr &"Match found at position "
   RetStr=RetStr&Match.FirstIndex&".Match Value is '"
   RetStr=RetStr&Match.Value&"'."&vbCRLF Next
   RegExpTest=RetStr

*/
  EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
  EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END 
--调用对象方法
  EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
--释放已创建的 OLE 对象
  EXEC @hr = sp_OADestroy @objRegExp
  IF @hr <> 0 BEGIN
   SET @results = 0
   RETURN @results
  END
 RETURN @results
 END

下面是一个简单的测试sql语句,可以直接在查询分析器中运行。
DECLARE @intLength AS INTEGER
DECLARE @vchRegularExpression AS VARCHAR(50)
DECLARE @vchSourceString as VARCHAR(50)
DECLARE @vchSourceString2 as VARCHAR(50)
DECLARE @bitHasNoSpecialCharacters as BIT

-- 初始化变量
SET @vchSourceString = 'Test one This is a test!!'
SET @vchSourceString2 = 'Test two This is a test'

-- 我们的正则表达式应该类似于
-- [a-zA-Z ]{}
-- 如: [a-zA-Z ]{10}  ...  一个十字符的字符串

-- 获得字符串长度
SET @intLength = LEN(@vchSourceString)

-- 设置完整的正则表达式
SET @vchRegularExpression = '[a-zA-Z ]{' + CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符
SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(@vchSourceString, @vchRegularExpression,0)

PRINT @vchSourceString
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
END ELSE BEGIN
 PRINT 'Special characters found.'
END

PRINT '**************'

-- 获得字符串长度
SET @intLength = LEN(@vchSourceString2)

-- 设置完整的正则表达式
SET @vchRegularExpression = '[a-zA-Z ]{' + CAST(@intLength as varchar) + '}'

-- 是否有任何特殊字符
SET @bitHasNoSpecialCharacters = dbo.find_regular_expression(@vchSourceString2, @vchRegularExpression,0)

PRINT @vchSourceString2
IF @bitHasNoSpecialCharacters = 1 BEGIN
 PRINT 'No special characters.'
END ELSE BEGIN
 PRINT 'Special characters found.'
END

GO

  • hery2002用户头像
  • hery2002
  • (苦*行*僧)
  • 等 级:
  • 2

    2

#15楼 得分:3回复于:2008-06-05 12:43:58
2005可以使用正则表达式的 :)
  • ranzj用户头像
  • ranzj
  • (天鹅,在高过云层的地方,用翅翼)
  • 等 级:
#16楼 得分:4回复于:2008-06-05 12:57:36
引用 15 楼 hery2002 的回复:
2005可以使用正则表达式的 :)


升二星不??
  • hery2002用户头像
  • hery2002
  • (苦*行*僧)
  • 等 级:
  • 2

    2

#17楼 得分:4回复于:2008-06-05 13:11:23
引用 16 楼 ranzj 的回复:
引用 15 楼 hery2002 的回复:
2005可以使用正则表达式的 :)

升二星不??

呵呵 :)
不知道诶,马上休假去了,
估计难....
  • hery2002用户头像
  • hery2002
  • (苦*行*僧)
  • 等 级:
  • 2

    2

#18楼 得分:4回复于:2008-06-05 13:13:31
引用 11 楼 MOTA 的回复:
算了
我去说服一下BOSS
让他用程序吧--!

我连程序都写好了- -~
可怜的ASP程序- -~!~~~~~

程序控制也可以,
SQL控制也可以,
既然已经程序控制了,
那就程序控制好了, :)
相关问题
过滤非法字符的问题~~搜了CSDN里面的代码出现如下问题Web 开发/ ASP ...
怎样过滤非法字符! Web 开发/ ASP - CSDN社区community.csdn.net
急~~登陆验证问题,在线等Web 开发/ ASP - CSDN社区community.csdn.net
关于JDom的非法字符的问题Java / Web Services / XML - CSDN社区 ...
求助!!防SQL注入代码或方法!! Web 开发/ ASP - CSDN社区community.csdn.net
关于SQL注入问题Web 开发/ ASP - CSDN社区community.csdn.net