这个问题在我的心中已经存在很长时间了。
起初认识到这个问题是从MSDN Webcast的一个视频中了解到的:为了防止SQL注入,在设计登录模块的时候要使用参数而不要使用类似
"SELECT COUNT(*) FROM ACCOUNT WHERE UserName = '" + TextBox1.Text + "' AND Password = '" + TextBox2.Text + "'"
这样的语句。知道了这个”秘密“以后,曾在学校的每次大作业完成后去搞搞同学们的大作业中的登录模块,呵呵,当时自己觉得这个很有意思。对于这个问题的注意对于我以后的设计影响很大。
出现这种情况实在是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_"等之类的图书了。