第五节 8注入漏洞与参数化查询

本文介绍了SQL注入攻击原理及如何利用参数化查询来有效防止此类安全威胁。通过实例展示了传统字符串拼接方式存在的风险,并提供了使用参数化查询的具体实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
/* SQL注入漏洞攻周
 * 登陆判断: select * FROM t_users where UserName=... and Password=...,将参数拼到SQL语句中
 * 构造恶意的Password: 1' or '1'='1
 * 防范注入漏洞攻击的方式:不使用SQL语句拼接,通过参数赋值
 * 
 * 查询参数
 * SQL语句使用@UserName表示"此处用参数代替",向SqlCommand的Parameters中添加参数
 * cmd.CommandText = "select * FROM t_user where username=@u AND password=@p";
 * cmd.Parameters.Add(new SqlParameter("u","admin"))
 * cmd.Parameters.Add(new SqlParameter("p","111111"));
 * 参数在SQLServer内部不是简单的字符串替换,sqlserver直接用添加值进行数据比较,因此不会有注入漏洞攻击
 *
 */
namespace _8注入漏洞与参数化查询
{
    class Program
    {
        static void Main(string[] args)
        {
            string dataDir = AppDomain.CurrentDomain.BaseDirectory;
            if (dataDir.EndsWith(@"\bin\Debug\")
                || dataDir.EndsWith(@"\bin\Release\"))
            {
                dataDir = System.IO.Directory.GetParent(dataDir).Parent.Parent.FullName;
                AppDomain.CurrentDomain.SetData("DataDirectory", dataDir);
            }

            /*Console.WriteLine("请输入用户名:");
            string username = Console.ReadLine();
            Console.WriteLine("请输入密码:");
            string password = Console.ReadLine();
            //输入1' or '1' = '1造成SQL注入漏洞攻击

            using (SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=E:\MyProjects\C#net传智播客\第五季ADO.NET\8注入漏洞与参数化查询\8注入漏洞与参数化查询\Database1.mdf;Integrated Security=True;User Instance=True"))
            {
                conn.Open();
                using (SqlCommand cmd = conn.CreateCommand()) 
                {
                    //cmd.CommandText = "select count(*) FROM T_User where UserName='"+username+"' AND Password='"+password+"' ";
                    
                    cmd.CommandText = "select count(*) FROM T_User where UserName=@UserName AND Password=@Password ";
                    cmd.Parameters.Add(new SqlParameter("UserName",username));
                    cmd.Parameters.Add(new SqlParameter("Password",password));

                    int i = Convert.ToInt32(cmd.ExecuteScalar());
                    if (i > 0)
                    {
                        Console.WriteLine("登陆成功!");
                    }
                    else {
                        Console.WriteLine("登陆失败!");
                    }
                }
            }*/

            /*案例
            
             用户界面中进行登陆判断,输错三次禁止登陆,用数据库记录ErrorTimes
             * 数据导入:从文本文件导入用户信息,易错点:
             * Paramter的重复添加
             * 
             * 数据导出,将用户信息导出到文本文件中
             */
            Console.ReadKey();
        }
    }
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值