gpt4 book ai didi

c# - 在 C# 中构建动态查询(SQL 注入(inject)攻击)

转载 作者:行者123 更新时间:2023-11-30 22:15:43 25 4
gpt4 key购买 nike

我有以下代码

public DataSet GetProject(string projectID)
{
DataSet dataTable = new DataSet();
DataAccess dataAccess = new DataAccess();
OracleCommand commandOb = new OracleCommand();
strQuery.Append("select projectName, managerName");
strQuery.Append("from project ");
strQuery.Append("where projectID = '" + projectID + "'");

cmd.CommandText = strQuery.ToString();
dataTable = dataAccess.ExecuteDataAdapter(commandOb);

return dataTable;
}

这是构建查询并执行查询的好方法吗?这会容易受到 SQL 注入(inject)攻击吗?

在动态构建查询方面是否有推荐的方法。任何帮助将不胜感激。

最佳答案

以这种方式构建查询确实使其容易受到 SQL 注入(inject)攻击,除非您手动转义了您的输入(即,通过使用数据库引擎特定的转义序列,“projectID”的值无法更改查询的结构) .但是,推荐的方法是使用参数化查询(有时称为“准备好的语句”)。使用参数化查询,您只需定义查询的结构,然后单独提供输入值作为参数,从而防止您的查询结构被 SQL 注入(inject)更改。

这是您的示例,更改为使用参数化:

public DataSet GetProject(string projectID)
{
DataSet dataTable = new DataSet();
DataAccess dataAccess = new DataAccess();
OracleCommand commandOb = new OracleCommand();
strQuery = @"select projectName, managerName
from project
where projectID = :ProjectID"

cmd.CommandText = strQuery;
cmd.Parameters.AddWithValue("ProjectID", projectID);
dataTable = dataAccess.ExecuteDataAdapter(commandOb);

return dataTable;
}

查询中的参数“:ProjectID”将替换为“AddWithValue”方法中给出的值。无论“projectID”变量中的值是什么,它都将始终作为 WHERE 子句的一部分进行评估。而之前,类似于 [' 的值; DELETE FROM project;--] 将查询更改为如下内容可能会产生不良影响:

select projectName, managerName
from project
where projectID = ''; DELETE FROM project;--'

关于c# - 在 C# 中构建动态查询(SQL 注入(inject)攻击),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17824262/

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