PostgreSQL中NpgsqlParameter的用法
时间:2019-01-23
本文章向大家介绍PostgreSQL中NpgsqlParameter的用法,主要包括PostgreSQL中NpgsqlParameter的用法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文主要介绍PostgreSQL数据库中NpgsqlParameter的用法。(MySql中MySqlParameter的用法与之类似)
首先,为什么要用NpgsqlParameter?那就要先分析直接执行SQL语句的风险了。
执行一个查询语句,目的是在表ModelInfo中查询ModelName等于某一值的行数目,该值由用户输入。代码如下:
static void Main(string[] args)
{
var connStr = "Server=localhost;Port=5433;Username=postgres;Password=123456;Database=Testpg100";
using (NpgsqlConnection con = new NpgsqlConnection(connStr))
{
string modelname = Console.ReadLine();
string sql = "select count(*) from \"ModelInfo\" where \"ModelName\" = '" + modelname + "'";
NpgsqlCommand cmd = new NpgsqlCommand(sql, con);
con.Open();
int num = Convert.ToInt32(cmd.ExecuteScalar());
Console.WriteLine("count:" + num);
}
}
用户输入为harris时,查询字符串如下:
select count(*) from "ModelInfo" where "ModelName" = 'Harris'
执行结果为:1,即:只有一条记录中“ModelName”的值为“Harris”。
上述是正常的做法,程序员喜欢的这样做的用户。但总有用户不走寻常路,他们不会老老实实按照程序员的期待输入一个ModelName的值,他们想输入的更多,如:
harris' or "ModelId"='
这是凌乱的输入表示什么?仅仅是ModelName的值的吗?看看它生成的查询字符串吧!
select count(*) from "ModelInfo" where "ModelName" = 'harris' or "ModelId"=''
是不是很神奇,生成的查询字符串不仅是可执行的,而且有了完全不同的含义。它不仅查询ModelName等于Harris的记录,也查询了ModelId等于' '的记录,这完全超出了程序的预期。
精巧的构造输入的SQL可以生成更厉害的语句,从而得到关于数据库中更多的信息,这些信息有可能是不应该提供给用户的,敏感信息的泄露会造成的损失不可预计。这种通过构造SQL获取数据库敏感信息的做法,有一个专业术语—SQL注入。
如何避免SQL注入?使用NpgsqlParameter,而不是直接执行SQL语句!
static void Main(string[] args)
{
var connStr = "Server=localhost;Port=5433;Username=postgres;Password=123456;Database=Testpg10";
using (NpgsqlConnection con = new NpgsqlConnection(connStr))
{
string modelname = Console.ReadLine();
string sql = "select count(*) from \"ModelInfo\" where \"ModelName\" = @name";
NpgsqlCommand cmd = new NpgsqlCommand(sql, con);
cmd.Parameters.Add(new NpgsqlParameter("@name", modelname));
con.Open();
int num = Convert.ToInt32(cmd.ExecuteScalar());
Console.WriteLine(num);
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- KEDA-Kubernetes 中基于事件驱动的自动伸缩
- 更新 Kubernetes APIServer 证书
- 0810-5.15.1-Impala执行invalidate metadata异常分析
- 笔记日记debug,推荐这个插件里的模板
- 我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。
- sklearn 模型的保存与加载
- R:如何使用RMarkdown渲染中文pdf报告
- 图解 SQL,这也太形象了吧!
- 用python爬取前程无忧网,看看我们是否真的“前程无忧”?
- 超硬核的 Python 数据可视化教程!
- Spark Core项目实战 | Top10 热门品类
- Spark Core项目实战 | 页面单跳转化率统计
- Chrome DevTools 全攻略!助力高效开发
- 终于有人把 Docker 讲清楚了,别再说不会 Docker 了!
- 如何在ggplot2图形上添加显著性差异注释?