insert/update/delete就用
string strSQL = “insert into news(title,content,AddTime) values (‘” + strTitle + “‘,'” + strContent + “‘,'” + DateTime.Now.Date + “‘)”;
DbManager.ExecuteNonQuery(strSQL);
这样处理执行数据库的操作非常方便,但不能有效防止SQL注入(过滤和替换字符总是防不胜防),看到有人用参数化SQL方式:
string strCnn = ConfigurationManager.ConnectionStrings[“lybConnectionString”].ConnectionString;
SqlConnection myConnection = new SqlConnection(strCnn);
SqlCommand command = new SqlCommand(“INSERT INTO UserPhoto (UserName,ContentType,Photo)” +
“VALUES (@UserName,@ContentType,@Photo)”, myConnection);
//使用Parameters.AddWithValue实现对参数的赋值
command.Parameters.AddWithValue(“@UserName”, TextBox1.Text);
command.Parameters.AddWithValue(“@ContentType”, fileType);
command.Parameters.AddWithValue(“@Photo”, fileData);
//打开连接,执行查询
myConnection.Open();
command.ExecuteNonQuery();
myConnection.Close();
以下转载:
“SQL注入攻击”问题。我们在程序中存在着大量拼接产生SQL语句的代码,这就会导致一个比较大的安全隐患,容易遭受SQL注入攻击。我们在代码中用的SQL语句是:
string sqlStr = “select * from [Users] where UserName='” + txtUserName.Text.Trim()
+ “‘and Password='” + txtUserPassword.Text.Trim() + “‘”;
在用户名、密码框中输入1‘ or ‘1’=1’后产生的SQL语句为:
select * from [Users] where UserName=’1′ or ‘1’=’1′ and Password=’1′ or ‘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”
然后创建命令对象的代码时,修改为:
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();
}
}
}
来源于:https://blog.csdn.net/qq_33204100/article/details/83145027