参数化查询防止Sql注入

拼接sql语句会造成sql注入,注入演示

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FillData(dataGridView1);
        }

        private void FillData(DataGridView dataGrid)
        {
            string connStr = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Employees where EmployeeID=\‘" + textBox1.Text + "\‘";
                using (SqlCommand sqlCommand = new SqlCommand(sql, conn))
                {
                    using (SqlDataAdapter sqlData = new SqlDataAdapter(sqlCommand))
                    {
                        DataTable dataTable = new DataTable();
                        sqlData.Fill(dataTable);
                        dataGrid.DataSource = dataTable;
                    }
                }
            }
        }
    }
}

正常生成的Sql语句应该为

select * from Employees where EmployeeID=‘1‘

输入sql实际生成的Sql语句为

select * from Employees where EmployeeID=‘‘ or 1=1 --‘

所有的数据都查询出来了

防止注入漏洞应该用SqlParameter做参数化查询

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FillData(dataGridView1);
        }

        private void FillData(DataGridView dataGrid)
        {
            string connStr = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                string sql = "select * from Employees where [email protected]";
                using (SqlCommand sqlCommand = new SqlCommand(sql, conn))
                {
                    SqlParameter[] sqlParameter = { new SqlParameter("@EmployeeID", textBox1.Text) };
                    sqlCommand.Parameters.AddRange(sqlParameter);
                    using (SqlDataAdapter sqlData = new SqlDataAdapter(sqlCommand))
                    {
                        DataTable dataTable = new DataTable();
                        sqlData.Fill(dataTable);
                        dataGrid.DataSource = dataTable;
                    }
                }
            }
        }
    }
}

再输入sql注入会报错

如果用在登录或者未经授权的查询时很有用

重新整理代码

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Configuration;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        string connStr = ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string sql = "select * from Employees where [email protected]";
            SqlParameter[] sqlParameter = { new SqlParameter("@EmployeeID", textBox1.Text) };
            FillGridView(sql, dataGridView1, sqlParameter);
        }

        private void FillGridView(string sql, DataGridView dataGrid, SqlParameter[] sqlParameter = null)
        {
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                using (SqlCommand sqlCommand = new SqlCommand(sql, conn))
                {
                    if (sqlParameter != null)
                    {
                        sqlCommand.Parameters.AddRange(sqlParameter);
                    }
                    using (SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand))
                    {
                        DataTable dataTable = new DataTable();
                        sqlDataAdapter.Fill(dataTable);
                        dataGrid.DataSource = dataTable;
                    }
                }
            }
        }
    }
}

原文地址:https://www.cnblogs.com/win32pro/p/12020516.html

时间: 2024-11-10 21:33:19

参数化查询防止Sql注入的相关文章

使用参数化查询防止SQL注入漏洞

参数化查询防止SQL注入漏洞 看别人的登录注册sql语句有没漏洞即可 Where  name='admin' or '1=1' and password='123'; 可以Or '1=1'就是漏洞 http://jingyan.baidu.com/article/27fa7326f53ea746f9271f79.html 以往的防御方式 以前对付这种漏洞的方式主要有三种: l        字符串检测:限定内容只能由英文.数字等常规字符,如果检查到用户输入有特殊字符,直接拒绝.但缺点是,系统 中

023. Asp.net参数化查询预防Sql注入攻击

1 /// <summary> 2 /// 参数化查询预防SQL注入式攻击 3 /// </summary> 4 public int checkLogin(string loginName, string loginPwd) 5 { 6 string strsql = "select count(*) from tb_LoginUser where [email protected] and [email protected]"; 7 SqlConnectio

参数化登陆防止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 _01参数化登陆防止SQL注入攻击 { public

MySQL参数化有效防止SQL注入

sql语句的参数化,可以有效防止sql注入 注意:此处不同于python的字符串格式化,全部使用%s占位 from pymysql import * def main(): find_name = input("请输入物品名称:") # 创建Connection连接 conn = connect(host='localhost',port=3306,user='root',password='mysql',database='jing_dong',charset='utf8') # 获

带参数的查询防止SQL注入攻击

把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数: 参数的设定: string strCmd = "SELECT AccountID FROM Account WHERE [email protected] AND [email protected]"; 对于SQL Server数据库,“@”是参数的前缀.上句中定义了两个参数:@AccountNa

ADO.NET快速入门——带参数的查询防止SQL注入攻击

相关知识: 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数: 参数的设定: string strCmd = "SELECT AccountID FROM Account WHERE [email protected] AND [email protected]"; 对于SQL Server数据库,“@”是参数的前缀.上句中定义了两个参数:@Acc

.net在Oracle数据库中为In条件查询防止sql注入参数化处理

//返回in条件处理方法 public static string InsertParameters(ref List<OracleParameter> orclParameters, int[] lsIds, string uniqueParName) { string strParametros = string.Empty; for (int i = 0; i <= lsIds.Length - 1; i++) { strParametros += i == 0 ? ":

模糊查询 防止 sql注入

mysql  mybatis 环境: 1>. 处理sql特殊字符 {"*","%","_"} --> 替换为 "/*","/%","/_" 2>.   sql 中处理,定义'/' 为转义字符   public abstract class BaseEntity extends PrimaryKeyObject<Long> { private static f

【实战】利用联合查询--手工SQL注入拿下网站

看到很多脚本小子,工具党用啊D,明小子,穿山甲对网站扫来扫去,拿个后台什么的,其实基础是最重要的,今天我来说一下纯手工注入一个站点. 目标网址:http://www.******.com/about.asp?id=1 1.首先确认这里是否存在整型注入,很简单,url后加' and 1=1 and 1=2,不细说.同时我们还判断出这是Access的数据库. 2.利用order by判断表项有几个: http://www.******.com/about.asp?id=1 order by 4(这里