关于字符匹配所引起的的问题

这个问题在我的心中已经存在很长时间了。

起初认识到这个问题是从MSDN Webcast的一个视频中了解到的:为了防止SQL注入,在设计登录模块的时候要使用参数而不要使用类似

"SELECT COUNT(*) FROM ACCOUNT WHERE UserName = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'"

这样的语句。知道了这个”秘密“以后,曾在学校的每次大作业完成后去搞搞同学们的大作业中的登录模块,呵呵,当时自己觉得这个很有意思。对于这个问题的注意对于我以后的设计影响很大。

我经常在网上购买一些图书。最近一年我对C#产生了浓厚的兴趣,因此常常到各大网上售书网站搜索并购买一些相关技术的图书。Joyo&Amazon是我常去的网站,因为其价格相对其他的几家网站来说还是比较便宜的,而且可以免费送货到我家(我并不是在给他们做广告)。然而,我对于最近几次在Joyo&Amazon上的购买过程很不满意。这个问题是由于Joyo&Amazon网站的搜索模块引起的,当你输入关键字”C#“后,搜索出来的结果集并非你想要搜索的图书。

出现这种情况实在是Joyo&Amazon编程人员的疏忽。如果用户无法搜索到自己想要搜索的图书,是这个网站设计中搜索模块的一个重大失败。我到当当网、china-pub和Amazon.com均没有发现这样的情况。
在当当网搜索”C#“


在china-puc搜索”C#"


在amazon.com搜索“C#”


我们不知道为什么在Joyo&Amazon搜索搜索“C#”出来的全都是C和C++的图书。我想可能是编程人员可能是为了安全考虑,将“#”符号做了一些处理以防止SQL注入之类的缘故吧!

我们都知道诸如:%,--,[,]等字符串匹配符都会影响到数据库中的select语句。假设书库中存在一本为《关于”C_“的问题》的图书,请问如何才能够检索出来这本图书呢?毫无疑问,可以使用select * from books where title like '%' + '[_]' + '%'的sql语句进行搜索。在这里使用了"[]"通配符。
......
因此,我想可以在两个"%"号之间采用一个字符串变量,通过程序对字符串进行字符化,然后从第一个字符开始依次遍历,如果存在字符匹配符号则使用[匹配符]做相应的处理(注意"]"例外),将处理后的变量加入到select语句,这样就可以搜索出"C#"和"C_"等之类的图书了。

原文地址:https://www.cnblogs.com/iPeterRex/p/1339329.html