热门标签 | 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限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
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社区 版权所有