「学习笔记」系统存储过程_参数化处理_防SQL注入

当熟悉数据库的人在你的用户名下面输入

' or 1=1--

或者

' delete users--

等等一类的吧,怎么办?

参数化是什么东西?参数化处理是一个对象。是C#里面的一个。

下面是普通写登录:

using System.Data.SqlClient;
Console.Write("请输入用户名:");
string? userName = Console.ReadLine();
Console.Write("请输入密码:");
string? password = Console.ReadLine();
using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=SchoolSystemDB"))
{
conn.Open();
string sql = #34;select count(userid) from users where username='{userName}' and pwd='{password}'";
SqlCommand command = new SqlCommand(sql, conn);
int result = (int)command.ExecuteScalar();
if (result > 0)
Console.WriteLine("登陆成功");
else
Console.WriteLine("登陆失败");
}

参数化处理:

using System.Data.SqlClient;
Console.Write("请输入用户名:");
string? userName = Console.ReadLine();
Console.Write("请输入密码:");
string? password = Console.ReadLine();
using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=SchoolSystemDB"))
{
conn.Open();
string sql = #34;select count(userid) from users where username=@userName and pwd=@pwd";
SqlParameter para1 = new SqlParameter("@userName", userName);//这两条进行处理
SqlParameter para2 = new SqlParameter("@pwd", password);
SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.Add(para1);//只要在ExecuteScalar()执行前加进去就可以。
command.Parameters.Add(para2);
int result = (int)command.ExecuteScalar();
if (result > 0)
Console.WriteLine("登陆成功");
else
Console.WriteLine("登陆失败");

上面这个不推荐,因为有些时候在使用sql的时候,不知道条件有多少,一般建议在组织sql的时候,

using System.Data.SqlClient;
Console.Write("请输入用户名:");
string? userName = Console.ReadLine();
Console.Write("请输入密码:");
string? password = Console.ReadLine();
//建立一个数组,把一个数组丢进下面command.Parameters.AddRange(paras)
SqlParameter[] paras =
{
new SqlParameter("@username", userName),
new SqlParameter("@pwd", password)
}
//这样的话,只需要改动上面即可,下面的代码基本上不用动。
using (SqlConnection conn = new SqlConnection("server=.;uid=sa;pwd=sa;database=SchoolSystemDB"))
{
conn.Open();
string sql = #34;select count(userid) from users where username=@userName and pwd=@pwd";
SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.AddRange(paras);//在ExecuteScalar()执行前即可。
int result = (int)command.ExecuteScalar();
if (result > 0)
Console.WriteLine("登陆成功");
else
Console.WriteLine("登陆失败");
}

可以使用参数化处理,防止SQL注入,这个办法是可行的。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章