热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer:不替换参数-SQLServer:Parameterisnotreplaced

Ivegotafullyfunctionable(secure)sessiontoaSQLServerdatabase(version10.50.4000).Thisi

I've got a fully functionable (secure) session to a SQL Server database (version 10.50.4000). This is stored in a public variable:

我有一个完全可用的(安全)会话到SQL Server数据库(版本10.50.4000)。这存储在一个公共变量中:

SqlConnection cOnn= new SqlConnection();

I only want to run SELECT queries. For anything else, the user account got no rights.

我只想运行SELECT查询。除此之外,用户帐户没有权利。

The queries are built with only one user entry, which is inserted into a simple Text Box.

查询仅使用一个用户条目构建,该条目插入到简单的文本框中。

Unfortunately I must not tell you the original command text. So I make it simple for you:

不幸的是,我不能告诉你原始的命令文本。所以我简单地告诉你:

function print_users(string filtervalue)
{
    SqlCommand cmd = null;
    cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%@fv%'", this.conn)

    cmd.Parameters.Add("@fv", SqlDbType.NVarChar);
    cmd.Parameters["@fv"].Value=filtervalue;

    rdr = cmd.ExecuteReader();

    while(rdr.Read())
    {
        //Do something with the answer from the DB
    }
}

But this does not do the trick. I also tried AddWithValue, but I got no luck.

但这并不能解决问题。我也试过AddWithValue,但我没有运气。

When creating a stop-point on the line, where @fv should be replaced, I can go through the code line-by-line. And I can see that the command, where @fv should be replaced, is processed with no error. But @fv is not replaced (or at least I cannot see the replacement in the debug console).

在线上创建停止点时,应该替换@fv,我可以逐行查看代码。我可以看到,应该替换@fv的命令在没有错误的情况下处理。但@fv没有被替换(或者至少我在调试控制台中看不到替换)。

What am I doing wrong?

我究竟做错了什么?

EDIT:

thank you for your replies. Leaving out the single quotes ( ' ) did the trick.

谢谢您的回复。省略单引号(')就可以了。

And I also learned that this is not a string replacement. Thank you.

而且我还了解到这不是字符串替代品。谢谢。

Just one word: The connection is not left open all the time. It's immediately closed, when it's not needed any more; and re-established when needed again - I just forgot to write that into my sample code.

只需一个字:连接不会一直打开。当它不再需要时立即关闭;并在需要时重新建立 - 我只是忘了将其写入我的示例代码中。

Again: Thank you for your help!

再次:谢谢你的帮助!

2 个解决方案

#1


2  

You can't see it being replaced in your debug session; the replacement occurs in the SQL server code itself...

您无法在调试会话中看到它被替换;替换发生在SQL服务器代码本身......

The client (your code) send both the SQL-string and the value of the parameter as seperate things to the server. There the SQL Engine 'replaces' the parameter with its value while executing it.

客户端(您的代码)将SQL字符串和参数的值作为单独的内容发送到服务器。在执行它时,SQL Engine会将参数替换为其值。

You should also put the 'wildcards' inside your parametervalue, not inside the query.

您还应该将'通配符'放在参数值内,而不是在查询中。

cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE @fv ", this.conn)
cmd.Parameters.Add("@fv", SqlDbType.NVarChar);
cmd.Parameters["@fv"].Value= "%" + filtervalue + "%";

#2


1  

The parameter is not working because it is inside a string literal. You want to build the string like this:

该参数无效,因为它位于字符串文字内。你想构建这样的字符串:

cmd = new SqlCommand("SELECT users From groups WHERE group_name LIKE '%' + @fv + '%'");

While we're at it, keeping a global connection like that is bad. It can cause strange side effects, especially in web apps. Instead, keep a global connection string, and then use that string to create a new connection on each request.

虽然我们在这方面,但保持这样的全球联系是不好的。它可能会导致奇怪的副作用,尤其是在Web应用程序中。相反,保留一个全局连接字符串,然后使用该字符串在每个请求上创建一个新连接。

Also, "replace" is the wrong word here. Sql parameters are never replaced, even when they work. That's the whole point. There is no string replacement into your query at any point, ever. It's more like you declared an @fv variable at the server level in a stored procedure, and assigned your data directly to that variable. In this way, there is no possibility for a vulnerability in parameter replacement code, because the data portion of your query remains separate throughout the execution process. In same way, don't think in terms of "sanitizing" a parameter for a query; instead, think in terms of quarantining the data.

此外,“替换”在这里是错误的词。即使它们工作,也永远不会替换Sql参数。这就是重点。在任何时候都没有字符串替换您的查询。它更像是在存储过程中在服务器级别声明了@fv变量,并将数据直接分配给该变量。通过这种方式,参数替换代码中不存在漏洞,因为查询的数据部分在整个执行过程中保持独立。同样,不要考虑“清理”查询的参数;相反,请考虑隔离数据。


推荐阅读
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
author-avatar
小赖小燕_380
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有