防SQL注入的参数化查询

在做机房收费系统的时候,曾经利用过传递参数的形式来将值传递给SQL语句或者存储过程,因为这样可以通过参数化的查询来帮助抵御“SQL 注入”式攻击,这种攻击者会将命令插入SQL语句,从而危机服务器的安全。

<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">SqlParameter Param = new SqlParameter("@CourseID", 4);</span></span>

这样可以从一定程度上来抵御SQL注入,但做的还不是很好,细心的话,你会发现SqlParameter这个类有7个构造函数,每个构造函数的参数都不同。既然要通过传参数给SQL语句赋值,那么为了做到匹配度最高,我们也可以把数据库存储的数据类型和大小也相应的匹配,这样做还可以提高查询执行性能,因为他们可帮助数据库服务器将传入命令与适当的缓存计划进行准确匹配。

<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;"> SqlParameter Params = new SqlParameter("@CourseID", SqlDbType.VarChar, 50, "CourseID");</span></span>

注释:上述采用了SqlParameter构造函数的形式,第一个参数传递的是注入的参数,第二是是类型,第三个参数是大小,第四个参数是数据库中相对应的列的名称。

改进

使用ParameterDirection(指定查询内的有关 DataSet 的参数的类型。)枚举型类型来对上述进行改进。

其中ParameterDirection有四个成员:Input(输入参数)、OutPut(输出参数)、InOutPut(输入输出参数)、ReturnValue(操作的返回值)

传递参数过程

<span style="font-family:SimSun;font-size:18px;">SqlParameter[] Params = new SqlParameter[2];

            DataBase DB = new DataBase();
            string strsql = "DELETE From UserAnswermr WHERE UserID= @UserID and [email protected]";
            Params[0] = DB.MakeInParam("@UserID", SqlDbType.VarChar, 50, userid);               //用户ID
            Params[1] = DB.MakeInParam("@PaperID", SqlDbType.Int, 4, paperid);  </span>

引入ParameterDirection

<span style="font-family:SimSun;font-size:18px;">  //公有方法,实例化一个用于调用存储过程的参数
        //输入:
        //      ParamName - 参数名称
        //      DbType		- 参数类型
        //      Size			- 参数大小
        //			Direction - 传递方向
        //			Value			- 值
        public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
        {
          SqlParameter Param;

          if(Size > 0)

            Param = new SqlParameter(ParamName, DbType, Size);
          else Param = new SqlParameter(ParamName, DbType);

          Param.Direction = Direction;

          if (Value != null)
            Param.Value = Value;

          return Param;
        }

		//公有方法,实例化一个用于调用存储过程的输入参数
		//输入:
		//      ParamName - 参数名称
		//      DbType		- 参数类型
		//      Size			- 参数大小
		//			Value			- 值
        public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
        {
          return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
        }		</span>

总结

通过引入ParameterDirection,一方面提高了查询的效率,另一方面更增加了传值得安全性。



时间: 2024-10-24 18:30:52

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

谈谈PHP网站的防SQL注入

SQL(Structured Query Language)即结构化查询语言.SQL 注入,就是把 SQL 命令插入到 Web 表单的输入域或页面请求参数的查询字符串中,在 Web表单向 Web 服务器提交 GET 或 POST 请求时,如果服务器端未严格验证参数的有效性和合法性,将导致数据库服务器执行恶意的 SQL 命令. SQL 注入攻击的过程: (1)判断 Web 应用是否可以进行 SQL 注入. (2)寻找 SQL 注入点. (3)猜解用户名和密码. (4)寻找 Web 系统管理后台入口

【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特别注意什么? 一.为何要优先使用PDO? PHP手册上说得很清楚: Prepared statements and stored procedures Many of the more mature databases support the concept of prepared statemen

Java 防SQL注入过滤器(拦截器)代码

原文出自:https://blog.csdn.net/seesun2012 前言 浅谈SQL注入: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,达到一定的非法用途. 解决办法 1.配置WEB-INF/web.xml <web-app> <welcome-file-list> <welcome-file>index.html</welcome-file> </welco

.Net防sql注入的方法总结

#防sql注入的常用方法: 1.服务端对前端传过来的参数值进行类型验证: 2.服务端执行sql,使用参数化传值,而不要使用sql字符串拼接: 3.服务端对前端传过来的数据进行sql关键词过来与检测: #着重记录下服务端进行sql关键词检测: 1.sql关键词检测类: 1 public class SqlInjectHelper:System.Web.UI.Page 2 { 3 private static string StrKeyWord = "select|insert|delete|fro

sqlalchemy防sql注入

银行对安全性要求高,其中包括基本的mysql防注入,因此,记录下相关使用方法: 注意:sqlalchemy自带sql防注入,但是在 execute执行 手写sql时 需要考虑此安全问题 对于 where in 的防sql注入:(in 的内容一定要是tuple类型,否则查询结果不对) in_str = tuple(input_list)sql = "(SELECT count(id) FROM {0} WHERE {0}.id IN :in_str);".format(cls.__tab

防SQL注入

addslashes(); 一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体思路 1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型 3.针对不通的服务器和数据库特点进行SQL注入攻击 三.SQL注入攻击实例 比如在一个登录界面,要求输入用户名和密码: 可以这样输入实现免帐号登录: 用户名: 'or 1 = 1 – 密 码: 点登陆,

nginx服务器防sql注入/溢出攻击/spam及禁User-agents

本文章给大家介绍一个nginx服务器防sql注入/溢出攻击/spam及禁User-agents实例代码,有需要了解的朋友可进入参考. 在配置文件添加如下字段即可  代码如下 复制代码 server { ## 禁SQL注入 Block SQL injections set $block_sql_injections 0; if ($query_string ~ "union.*select.*(") { set $block_sql_injections 1; } if ($query_

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

PHP防SQL注入攻击

PHP防SQL注入攻击 收藏 没有太多的过滤,主要是针对php和mysql的组合. 一般性的防注入,只要使用php的 addslashes 函数就可以了. 以下是一段copy来的代码: PHP代码 $_POST = sql_injection($_POST); $_GET = sql_injection($_GET); function sql_injection($content) { if (!get_magic_quotes_gpc()) { if (is_array($content))