sql注入漏洞曾经是Web应用程序的噩梦,CMS、BBS、Blog无一不曾受其害。sql注入的原理以往在Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:
string sql = "SELECT top 1 * FROM [User] WHERE Username = '" + username + "' AND Password = '" + password + "'";
其中username和password两个变量的值是由用户输入的。在username和password都合法的情况下,这自然没有问题,但是用户输入是不可信的,一些恶意用户只要用一些技巧,就可以绕过用户名、密码登录。假设password的值是"1' or '1' = '1",username的值随便取,比如是"abc",那变量sql的值就是:
SELECT top 1 * FROM [User] WHERE Username = 'abc' AND Password = '1' or '1' = '1'
由于'1' = '1'恒为真,因此只要User表中有数据,不管Username、Password的值是否匹配,这条sql命令准能查出记录来。就这样,登录系统就被破解了。以往的防御方式以前对付这种漏洞的方式主要有三种:字符串检测:限定内容只能由英文、数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝。但缺点是,系统中不可避免地会有些内容包含特殊字符,这时候总不能拒绝入库。
字符串替换:把危险字符替换成其他字符,缺点是危险字符可能有很多,一一枚举替换相当麻烦,也可能有漏网之鱼。
存储过程:把参数传到存储过程进行处理,但并不是所有数据库都支持存储过程。如果存储过程中执行的命令也是通过拼接字符串出来的,还是会有漏洞。参数化查询近年来,自从参数化查询出现后,sql注入漏洞已成明日黄花。
参数化查询(Parameterized query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为sql指令的一部份来处理,而是在数据库完成sql指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、sql Server、MysqL、sqlite等常用数据库都支持参数化查询。
sql代码如下:
MysqLConnection conn = new MysqLConnection("server=127.0.0.1;uID=root;pwd=12345;database=test;");conn.open();MysqLCommand cmd = new MysqLCommand("SELECT * FROM `User` WHERE Username = ?Username AND Password = ?Password liMIT 1");cmd.Connection = conn;cmd.Parameters.AdDWithValue("Username","user01");cmd.Parameters.AdDWithValue("Password","123456");MysqLDataReader reader = cmd.ExecuteReader();reader.Read();int userID = reader.GetInt32(0);reader.Close();conn.Close();---- 来自jb51.cc
总结 以上是内存溢出为你收集整理的MYSQL使用参数化查询防止SQL注入漏洞全部内容,希望文章能够帮你解决MYSQL使用参数化查询防止SQL注入漏洞所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)