Tag: sql injection

如何防止用户生成的Sql查询上的Sql注入

我有一个项目(私有,ASP.net网站,密码用https保护),其中一个要求是用户能够输入将直接查询数据库的Sql查询。 我需要能够允许这些查询,同时防止它们对数据库本身造成损害,以及访问或更新它们无法访问/更新的数据。 我已经提出了以下实施规则: 使用仅具有Select Table / View和Update Table权限的db用户(因此任何其他命令,如drop / alter / truncate / insert / delete都不会运行)。 validation语句以“选择”或“更新”字样开头 validation(使用正则表达式)语句中没有半冒号实例,这些实例未被单引号,空格和字母包围。 (这里的想法是,他们可以包含第二个查询的唯一方法是使用不是输入字符串一部分的分号结束第一个查询。 validation(使用Regex)用户是否有权访问正在查询/更新的表,包含在连接中等。这包括任何子查询。 (实现这一目标的部分方式是用户将使用一组实际上不存在于数据库中的表名,部分查询解析将用正确的相应表名替换为查询) 。 我错过了什么吗? 目标是用户能够以他们认为合适的任何方式查询/更新他们有权访问的表,并防止任何意外或恶意企图破坏数据库。 (并且由于要求是用户生成sql,我无法使用我所知道的任何内置工具对查询进行参数化或清理它)。

动态LINQ直接用户输入,有任何危险吗?

我在ASP.NET MVC应用程序中有一个表,我希望它可以排序(服务器端)并使用AJAX过滤。 我希望它在其他地方使用起来相当容易,并且不想将排序和过滤硬编码到查询表达式中,所以我找到了一种动态构建表达式的方法,我发现最好的方法就是使用Dynamic LINQ 。 来自以下URL的用户输入直接插入到动态Where或OrderBy中。 /Orders?sortby=OrderID&order=desc&CustomerName=Microsoft 这将导致两个表达式: OrderBy(“OrderID descending”) Where(@”CustomerName.Contains(“”Microsoft””)”) 虽然我明白它不会直接在数据库中抛出,并且在这里插入直接SQL不会起作用,因为它无法反映到属性并且它是类型安全的所有,我想知道是否有人比我更有创意无论如何都可以找到一种方法来利用它。 我能想到的一个漏洞是,可以对表中不可见的属性进行排序/过滤,但这并不是有害的,因为它们仍然不会被显示,并且可以通过散列来防止它。 我允许直接用户输入的唯一方法是使用OrderBy和Where。 只是确定,谢谢:)

插入带有SQL注入安全参数的DB?

我一直在阅读有关SQL注入的内容,我想确保我的代码可以让它说“安全”,我打算使用RegExpvalidation器来检查用户输入,但是这里的另一个post建议只使用参数化查询,我我正在使用它们,但我想确保我的代码是安全的,是吗? using ( SqlConnection dataConnection = new SqlConnection(myConnectionString) ) { using ( SqlCommand dataCommand = dataConnection.CreateCommand() ) { dataCommand.CommandText = “INSERT INTO Lines (Name, CreationTime) ” + “VALUES (@LineName, @CurrentDateTime)”; dataCommand.Parameters.AddWithValue(“@LineName”, TextBox2.Text); dataCommand.Parameters.AddWithValue(“@CurrentDateTime”, DateTime.Now.ToString()); dataConnection.Open(); //do other DB stuff 我打破了最后一部分以使post更短,其余部分只是尝试捕获exception并关闭数据库连接以及提供用户插入成功的反馈。

防止插入时的SQL注入

我正在寻找一些防止SQL注入的技巧。 我在一个论坛上被告知我的代码不安全,我正在找一个足够好的人来帮助我解决这个问题。 我有一个webform并在提交时转到aspx.cs页面并将数据插入到ms sql数据库中。 protected void Submit_Click(object sender, EventArgs e) { string FullStartTime = StartTimeHourList.SelectedValue + “:” + StartTimeMinuteList.SelectedValue + ” ” + StartTimeAMList.SelectedValue; string FullEndTime = EndTimeHourList.SelectedValue + “:” + EndTimeMinuteList.SelectedValue + ” ” + EndTimeAMList.SelectedValue; OleDbConnection conn; OleDbCommand cmd; conn = new System.Data.OleDb.OleDbConnection(“”); cmd = new System.Data.OleDb.OleDbCommand(); conn.Open(); cmd.Connection = conn; var sql […]

如何参数化复杂的OleDB查询?

我正在尝试重构一些使用字符串连接来创建SQL命令的代码(这使得它易受SQL注入攻击)。 基本上我所要做的就是用SQL命令和OleDB参数列表替换所有string sqlToExecute = String.Format(..)语句。 我理解如何对像String.Format(“Select * from myTable where id = {0}”, id)这样的简单案例String.Format(“Select * from myTable where id = {0}”, id) 。 但是,我找不到一组更复杂的SQL查询的好例子。 以下是一些我不确定如何参数化的查询: 1.参数用于列名和别名; 参数由两个变量组成: selQueryBldr.AppendFormat(“SELECT * FROM {0} {1} INNER JOIN ColChange CC ON CC.TableRecordID = {1}.{2} and CC.EntityID='{3}'”, entity.StageTableName, stageTableAlias, entity.PrimaryKey, entity.EntityID); 2.在多个SQL IN子句中使用相同的参数 SQL查询: SELECT A.TablePrefix … FROM Entity E […]

使用替换单引号和validation整数的SQL注入

可能重复: 我可以通过使用单引号转义单引号和周围用户输入来防止SQL注入吗? 我只是想知道,如果我在用户输入中替换每个’ with ” ,例如string.Replace(“‘”,”””) ,并validation数字(确保它们是数字,并且不包含任何数字其他角色),SQL注入仍然可能吗? 怎么样? 我正在使用SqlCommand使用动态SQL查询。 像这样的东西: cmd.CommandText = “SELECT * FROM myTable WHERE ID = ” + theID.ToString(); 要么 cmd.CommandText = “UPDATE myTable SET title='” + title.Replace(“‘”,”””) + “‘ WHERE ID = ” + theID.ToString(); 在ASP.NET MVC中自动validation输入整数(检查它们是否为实数)。

在SQL Server中动态创建SQL vs参数

如果我要从表中选择一行,我基本上有两个选项,或者像这样 int key = some_number_derived_from_a_dropdown_or_whatever SqlCommand cmd = new SqlCommand(“select * from table where primary_key = ” + key.ToString()); 或使用参数 SqlCommand cmd = new SqlCommand(“select * from table where primary_key = @pk”); SqlParameter param = new SqlParameter(); param.ParameterName = “@pk”; param.Value = some_number_derived_from_a_dropdown_or_whatever; cmd.Parameters.Add(param); 现在,我知道第一种方法因为可能的sql注入攻击而不受欢迎,但在这种情况下,参数是一个整数,因此不应该真正注入恶意代码。 我的问题是:您是否在生产代码中使用选项1,因为您认为使用安全是因为易于使用和控制插入的参数(如上所述,或者参数是否在代码中创建)? 或者你总是使用参数,不管是什么? 参数100%注射安全吗?

如何保护此函数免受SQL注入?

public static bool TruncateTable(string dbAlias, string tableName) { string sqlStatement = string.Format(“TRUNCATE TABLE {0}”, tableName); return ExecuteNonQuery(dbAlias, sqlStatement) > 0; }

如何将SQL查询重新编写为参数化查询?

我听说我可以通过使用参数化查询来防止SQL注入攻击,但我不知道如何编写它们。 我如何将以下内容编写为参数化查询? SqlConnection con = new SqlConnection( “Data Source=” + globalvariables.hosttxt + “,” + globalvariables.porttxt + “\\SQLEXPRESS;” + “Database=ha;” + “Persist Security Info=false;” + “UID='” + globalvariables.user + “‘;” + “PWD='” + globalvariables.psw + “‘”); string query = “SELECT distinct ha FROM app WHERE 1+1=2”; if (comboBox1.Text != “”) { query += ” AND firma […]

SQL注入攻击防范:我从哪里开始

我希望使我的网站安全抵御SQL注入攻击。 有没有人有任何良好的链接,以使网站在ASP.NET站点(c#,Web表单)中抵御这些类型的攻击? 编辑: 我应该指出我正在使用entity framework