gpt4 book ai didi

c# - Sql Injection - 以下内容是否容易受到攻击?

转载 作者:行者123 更新时间:2023-11-29 03:48:11 24 4
gpt4 key购买 nike

我最近开始在一家对 SQL 注入(inject)攻击持开放态度的公司工作。因为他们几乎没有输入卫生设施。

指出问题后,我的任务是修复它。

通常这会很容易,用 SQLParamater 对象替换裸变量。但是,我发现了一些让我感到疑惑的稍微奇怪的代码用法。

我的前任似乎一直在使用存储过程和一些驻留在代码中的 SQL。然而在一个地方,他似乎将两者结合起来。

他使用一些裸变量动态构建 SQL,然后将此生成的 SQL 作为参数传递给存储过程。

我想知道它的安全性,将实际的 SQL 作为参数传递通过以净化它,还是我必须重新设计存储过程?

这是他正在做的事情的一个(大大简化的)片段:

DataSet ExecuteQuery(string unsanitizedInput)
{
string dynamicSQL = "WHERE column = " + unsanitizedInput;
MySqlParameter param = new MySqlParameter("param1", dynamicSQL);
string procname = "StoredProc_Name";
DataSet ds = new DataSet();

using (MySql.Data.MySqlClient.MySqlDataAdapter adapter = new MySql.Data.MySqlClient.MySqlDataAdapter(procname, DataUtils.ConnectionStrings["string"]))
{
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
adapter.SelectCommand.Parameters.Add(param);
adapter.Fill(ds);
}
return(ds);
}

显然,实际的查询要复杂得多,参数很多。但这应该让您了解他在做什么。

我的问题是:以上安全吗?即使是要注入(inject)到存储过程中的更大的 SQL 语句的一部分,未净化的输入也会被净化吗?

我知道上面的做法很糟糕,几乎不可能弄清楚 SQL 查询,但这就是我现在的处境。

提前感谢所有建议。

最佳答案

带参数的查询不能提供针对 slq 注入(inject)攻击的完全保护,存储过程也不能。我都用过,但在 2010 年网站的数据库受到 two-step sql injection 的严重伤害.

MSDN 强烈建议检查任何输入文本是否存在可疑元素。查看更多How To: Protect From SQL Injection in ASP.NET .

我使用以下简单代码来检测 sql 注入(inject)(使用一些我已经不记得的好源构建):

public static bool DetectSqlInjection(string Text)
{
string CleanText = Text.ToUpper().Replace("/**/", " ").Replace("+", " ").Replace(" ", " ");

string[] InjectionPatterns = {
"VARCHAR",
"EXEC",
"DECLARE",
"SELECT *",
"SELECT PASSWORD",
"SELECT USERNAME",
"$_GET",
"NULL OR",
"UNION ALL SELECT",
"WAITFOR DELAY",
"SELECT pg_sleep",
"SHOW TABLES FROM"
};

foreach (string Pattern in InjectionPatterns)
{
if (CleanText.Contains(Pattern))
return true;
}

return false;
}

关于c# - Sql Injection - 以下内容是否容易受到攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27919040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com