热门标签 | 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代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文介绍如何使用 Python 的 xlrd 库读取 Excel 文件,并将其数据处理后存储到数据库中。通过实际案例,详细讲解了文件路径、合并单元格处理等常见问题。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 使用 GitHub、JSDelivr、PicGo 和 Typora 构建高效的图床解决方案
    本文详细介绍了如何利用 GitHub 仓库、JSDelivr CDN、PicGo 图床工具和 Typora 编辑器,搭建一个高效且免费的图床系统。通过此方案,用户可以轻松管理和上传图片,并在 Markdown 文档中快速插入高质量的图片链接。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 鼠标悬停出现提示信息怎么做
    概述–提示:指启示,提起注意或给予提醒和解释。在excel中会经常用到给某个格子增加提醒信息,比如金额提示输入数值或最大长度值等等。设置方式也有多种,简单的,仅为单元格插入批注就可 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
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社区 版权所有