版权声明:原创博文,转载请标注链接!!! https://blog.csdn.net/qq_33204100/article/details/83145027 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p>“SQL注入攻击”问题。我们在程序中存在着大量拼接产生SQL语句的代码,这就会导致一个比较大的安全隐患,容易遭受SQL注入攻击。我们在代码中用的SQL语句是:</p>
string sqlStr = "select * from [Users] where UserName='" + txtUserName.Text.Trim()
+ "'and Password='" + txtUserPassword.Text.Trim() + "'";
- 1
- 2
在用户名、密码框中输入1‘ or ‘1’=1’后产生的SQL语句为:
select * from [Users] where UserName='1' or '1'='1' and Password='1' or '1'='1'
- 1
而‘1’=‘1’永远是正确的。这样,用户在不知道合法的用户名和密码的情况下,通过构造特殊的SQL语句,就顺利地进入了系统,导致我们的用户验证模块形同虚设!为了避免这种情况的发生,提高程序的安全性,需要使用参数化SQL语句。
在ADO.NET对象模型中执行一个参数化查询,需要向SqlCommand对象的Parameters集合添加SqlParameter对象。生成SqlParameter对象最简单的方式是调用SqlCommand对象的Parameters集合的AddWithValue方法。
这里又学习了一个新的对象:SqlParameter,表示SqlCommand的参数。
使用参数化SQL语句的步骤是:
定义包含参数的SQL语句,用@符号声明参数。为SQL语句中出现的每一个参数定义参数对象,并将参数对象加入到SqlCommand对象中。给参数赋值,并执行SQL语句。所以,修改上面的代码为:
string sqlStr="select * from [Users] where UserName=@UserName and Password=@Password"
- 1
然后创建命令对象的代码时,修改为:
SqlCommand cmd = new SqlCommand(sqlStr,conn);
cmd.Parameters.AddWithValue("@UserName",txtUserName.Text.Trim());
cmd.Parameters.AddWithValue("@Password",txtUserPassword.Text.Trim());
现在,再次运行程序,在用户名和密码框中都输入‘1 or ’1‘=1’后,会提示“用户名或密码错误”,这样用户就没有办法非法登录系统了。
实例: C#语言Winform防SQl注入做用户登录的例子
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace OmyGod { public partial class Form1 : Form { private static string connectionString = "Data Source=.;Initial Catalog=Omy;Integrated Security=True"; public Form1() { InitializeComponent(); } enum message { 用户名或者密码输入错误 = 1, 登录成功 = 2, } public bool check(string name, string pass) { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandText = "select * from auser where name = @name and pass = @pass"; cmd.Parameters.AddRange( new SqlParameter[]{ new SqlParameter("@name",SqlDbType.VarChar){Value=this.name.Text}, new SqlParameter("@pass",SqlDbType.VarChar){Value=this.pass.Text}, }); cmd.ExecuteNonQuery(); SqlDataAdapter ada = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); ada.Fill(ds); //return ds; DataSet data = ds; if (data.Tables[0].Rows.Count == 0){ MessageBox.Show((message.用户名或者密码输入错误).ToString()); }else{ index mm = new index(); mm.Show(); this.Hide(); // MessageBox.Show((message.登录成功).ToString()); } return false; } } //用户登录 private void button1_Click(object sender, EventArgs e) { string name = this.name.Text; string pass = this.pass.Text; check(name, pass); } private void button2_Click(object sender, EventArgs e) { this.Close(); } } }
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet"> </div>
版权声明:原创博文,转载请标注链接!!! https://blog.csdn.net/qq_33204100/article/details/83145027 </div>
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
</svg>
<p>“SQL注入攻击”问题。我们在程序中存在着大量拼接产生SQL语句的代码,这就会导致一个比较大的安全隐患,容易遭受SQL注入攻击。我们在代码中用的SQL语句是:</p>