前言

  • 例行前言【我也不知道为什么一定要这个】
  • 数据库是程序开发过程中必须要涉及到的内容,除不存储或者采用文件存储的程序之外,基本都会涉及到数据库的操作
  • 关于数据库操作,无非涉及到增、删、改、查,正常情况下,写上sql语句,传递变量值,运行即可。
  • 那么问题来了,如果用户是一个守规矩的用户,即严格按照程序使用说明来操作的用户,我们不用担心sql注入的问题;但如果用户不是那么“听话”,就是要随着性子来,碰巧,又输入了类似“ ‘1’or‘1’=‘1’ ”这样的用户名和密码呢?
  • 如果同时,程序又没有进行防sql注入处理,那么,很不幸,用户可能就绕过了你辛辛苦苦做的登录验证,直接进入系统内部了。

方法

  • 说了这么多,那要怎么防止sql注入的发生呢,那就是使用:参数化
  • 不多说,直接上代码看看
query = "insert into user_info (u_userid, u_name, u_dep, u_level, u_EntryTime)" +
                        "values (@userid, @name, @dep, @level, @entrytime)";
MySqlConnection connection = common.myOwnCon();
connection.Open();
MySqlCommand MyCommand = new MySqlCommand(query, connection);
MyCommand.Parameters.AddWithValue("@userid", userid);
MyCommand.Parameters.AddWithValue("@name", name);
MyCommand.Parameters.AddWithValue("@dep", dep);
MyCommand.Parameters.AddWithValue("@level", level);
MyCommand.Parameters.AddWithValue("@entrytime", entrytime);
MyCommand.ExecuteNonQuery();
  • 通过上述代码,我们可以看到,我们没有按照以往的方式,直接给 query 字段进行变量传值,而是使用了“@”这个符号。
  • 我们通过“@”字符在sql语句中注明了参数,在后续连接数据库的过程中,我们使用了Parameters.AddWithValue方法对参数进行赋值,Parameters.AddWithValue("@userid",userid)"@userid"是参数名,后方的userid是参数值,即我们的变量。
  • 通过这种方式对sql及进行处理,可以有效的防止因为sql拼接带来的sql注入风险。