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

C#学习教程:防止ASP.NETWeb应用程序上的SQL注入分享

防止ASP.NETWeb应用程序上的SQL注入我是C#和ASP.NET的新手。我正在使用VS2005C#和SQLServer2005,并且已经做了一些关于防止SQL注入的研究我的服

防止ASP.NET Web应用程序上的SQL注入

我是C#和ASP.NET的新手。

我正在使用VS2005 C#和SQL Server 2005,并且已经做了一些关于防止SQL注入的研究

我的服务器端 Web应用程序中有几个函数,我不确定它们是否需要输入validation。


1)从工具箱登录控件。 我已经直接从VS Toolbox实现了登录控件,我尝试使用RegularExpressionValidator作为我的登录工具,但它似乎不起作用。 Microsoft是否已对该工具进行内置validation?


2)将Excel文件表上传到SQL Server数据库。 我有一个function,允许用户将Excel文件表上传到数据库中。 一开始我不觉得有必要validation它,因为没有打开的SQL查询,但之后我问自己是否有可能用户在excel文件中输入SQL查询,这将导致上传期间的SQL注入。 以下是我的上传代码片段,如果需要validation,我们期待提供建议:

string cOnnStr= "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strUploadFileName + ";Extended Properties=Excel 8.0;"; using (OleDbConnection cOnnection= new OleDbConnection(connStr)) { string selectStmt = string.Format("Select [COLUMNS] FROM [userlist$]"); OleDbCommand command = new OleDbCommand(selectStmt, connection); connection.Open(); Console.WriteLine("Connection Opened"); // Create DbDataReader to Data Worksheet using (DbDataReader dr = command.ExecuteReader()) { // SQL Server Connection String string sqlCOnnectionString= "Data Source="; // Bulk Copy to SQL Server using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString)) { bulkCopy.DestinatiOnTableName= "UserDB"; bulkCopy.WriteToServer(dr);; } } } 

3) INSERT语句。 我有几个INSERT语句,主要用于将新记录插入数据库。 由于这些语句实际上并不从数据库中获取数据,因此我不确定是否需要validation。 以下是INSERT语句示例:

 SqlConnection cOnn= new SqlConnection(""); string sql = string.Format("INSERT INTO [UserData] (Username, Password, Role, Membership, DateOfReg) VALUES ('" + un.Text + "', '" + pw.Text + "', '" + role.Text + "', '" + ms.Text + "', '" + dor.Text + "')"); --> all *.Text are textboxes on the webpage SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); 

4)网页中的搜索function。 我有几个.aspx页面,它们通过GridView显示数据。 下面是我的搜索查询示例,它使用文本框和下拉列表filter:

 SqlDataSource1.SelectCommand = "SELECT * FROM [UserData] where [" + DropDownList1.Text + "] like '%" + searchTextBox.Text + "%'"; SqlDataSource1.DataBind(); 

我想知道对sql语句本身进行输入validation检查的最简单方法是什么, 而不创建其他方法和函数 ,对于上面的例子,我已经看过regular expression并使用mysql_real_escape_string

提前感谢您提供的任何建议和意见。

给出的直接例子也是好的。

在这些示例中不需要validation(检查引号等内容),并且永远不应该使用(除少数情况下,白名单可能是合适的)。

所需要的是参数化 。 使用参数而不是连接。

SqlBulkCopy直接处理数据,所以没关系

 SqlConnection cOnn= new SqlConnection(""); string sql = string.Format("INSERT INTO [UserData] (Username, Password, Role, Membership, DateOfReg) VALUES ('" + un.Text + "', '" + pw.Text + "', '" + role.Text + "', '" + ms.Text + "', '" + dor.Text + "')"); --> all *.Text are textboxes on the webpage SqlCommand cmd = new SqlCommand(sql, conn); conn.Open(); cmd.ExecuteNonQuery(); conn.Close(); 

只是要求被滥用。 你的系统被破坏了 。 你应该有类似的东西:

 cmd.CommantText = "INSERT INTO [UserData] (Username, ...) VALUES (@username, ...)"; cmd.Parameters.AddWithValue("Username", un.Text); ... 

或任何其他添加参数的方法。

你的例子4是一个有趣的例子,这是白名单可能适合的例子; SQL Server不允许您参数化列名,但您不能信任来自客户端的值。 如果您需要 “根据输入选择列”,则必须根据预期值进行测试:

 string[] allowedColumns = new[] {"Name", "Description", "Foo", "Bar"}; string colName = ... if(!allowedColumns.Contains(colName)) colName = allowedColumns[0]; // DENIED! 

一旦您按照预期值将列列入白名单,您现在知道该值不是"] where 1=1 drop table Users drop table Customers --"

然而! 搜索值应该参数化,即

 `... LIKE @searchValue` 

其中searchValue参数的值为"%" + something.Text + "%"

创建SqlCommand并传递数据,因为SqlParameter将为您完成任务

MSDN: SqlCommand.Parameters属性

 private static void UpdateDemographics(Int32 customerID, string demoXml, string connectionString) { // Update the demographics for a store, which is stored // in an xml column. string commandText = "UPDATE Sales.Store SET Demographics = @demographics " + "WHERE CustomerID = @ID;"; using (SqlConnection cOnnection= new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(commandText, connection); command.Parameters.Add("@ID", SqlDbType.Int); command.Parameters["@ID"].Value = customerID; // Use AddWithValue to assign Demographics. // SQL Server will implicitly convert strings into XML. command.Parameters.AddWithValue("@demographics", demoXml); try { connection.Open(); Int32 rowsAffected = command.ExecuteNonQuery(); Console.WriteLine("RowsAffected: {0}", rowsAffected); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } 

最简单的方法是将参数输入sql命令而不是直接传递。 如果通过参数传递值,.net和Sql将处理传递的数据类型。

例如,请参阅以下内容:

 SelectCommand.CommandText = "Select * From [UserData] where ColumnValue like @RowValue"; SelectCommand.Parameters.AddWithValue("@RowValue","% ActualRowValue %"); 

您可以使用标记添加参数。 请参阅带参数的asp:SqlDataSource select命令

上述就是C#学习教程:防止ASP.NET Web应用程序上的SQL注入分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记


推荐阅读
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
author-avatar
mobiledu2502873797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有