Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架核心在多个表上执行原始UNIONSQL查询_C#_Ajax_Sqlite_Entity Framework Core - Fatal编程技术网

C# 如何使用实体框架核心在多个表上执行原始UNIONSQL查询

C# 如何使用实体框架核心在多个表上执行原始UNIONSQL查询,c#,ajax,sqlite,entity-framework-core,C#,Ajax,Sqlite,Entity Framework Core,我正在为一个CTF竞赛编写一个带有故意实施的漏洞的web应用程序,我正在使用ASP.NET核心和实体框架核心以及SQLite数据库。我想让SQL注入成为可能,为了实现这一点,我需要使用union语句在多个表上查询数据库 不幸的是,我所有的尝试都导致了错误消息。后端控制器通过ajax请求获取一个参数,客户端应该误用UserId变量并修改ajax请求中的参数,以获得关于另一个表的更多信息 我尝试了几种FromSql方法,但都没有成功。有人知道我怎么解决这个问题吗 这是后端控制器代码 public J

我正在为一个CTF竞赛编写一个带有故意实施的漏洞的web应用程序,我正在使用ASP.NET核心和实体框架核心以及SQLite数据库。我想让SQL注入成为可能,为了实现这一点,我需要使用union语句在多个表上查询数据库

不幸的是,我所有的尝试都导致了错误消息。后端控制器通过ajax请求获取一个参数,客户端应该误用UserId变量并修改ajax请求中的参数,以获得关于另一个表的更多信息

我尝试了几种FromSql方法,但都没有成功。有人知道我怎么解决这个问题吗

这是后端控制器代码

public JsonResult ListImagePaths(string UserId)
{
    string query = $"SELECT * FROM UserImage WHERE UID == {UserId}";

    var results = mContext.UserImage.FromSql(query);           

    return Json(results);
}
这样,我只对UserImage表执行查询。我没有找到查询两个表的方法。我试图创建一个由两个表中的属性组成的数据库集,但这也不起作用

这是客户端ajax请求

$(document).ready(function () {
    $.ajax({
        type: 'GET',
        url: 'ListImagePaths/"27b988e3-77ab-41e4-b945-6ac9315a70ec"',
        success: function (result){
            console.log(result)
        }
    })
})
下面是UserImage表的一个示例

Uid=27b988e3-77ab-41e4-b945-6ac9315a70ec Path=CloudImages/picture.jpg Id=e802a368-229f-4ed5-ba84-42ce4da5ed0a

下面是AspNetUsers表的示例

Id=81858e0d-e75f-45c5-8054-ef956e843a04 用户名=SomeGuy43 NormalizedUserName=SOMEGUY43 电子邮件=myemail@somehere.com 正常化电子邮件=MYEMAIL@SOMEWHERE.COM 电子邮件确认=1 PasswordHash=uRGWeGWq5ZorrzgNvSuz8Q== SecuritySamp=RBCZDCBA3IEMPET2ZCL4MVCXW3IA3H4C 并发amp=0b8873cc-ecfe-4280-a6bf-0f354242f4a4 PhoneNumber=NULL PhoneNumberConfiged=0 TwoFactorEnabled=0 LockoutEnd=0 LockoutEnabled=0 AccessFailedCount=0 AvatarImage=pictures/avatar.jpg 盐=4r10cC IsAdmin=0

尝试此查询:

string query = $"SELECT * FROM UserImage WHERE UID == convert(UNIQUEIDENTIFIER, convert(varchar(max),{UserId}))";
我想强调的是,使用*是不符合性能的,最好使用列

我没有找到查询两个表的方法。我试图创建一个由两个表中的属性组成的数据库集,但这也不起作用

不确定到底是什么不起作用,但这是一条路要走。但是,与其创建包含公共属性的类的DbSet,从而告诉EF要处理的是一个实体,不如创建DbQuery,或者简单地将该类注册为

例如:

public class MyQueryType
{
    public Guid Id { get; set; }
    publc string Text { get; set; }
}
在DbContext类中,执行以下操作之一:

public DbQuery<MyQueryType> MyQueryType { get; set; }
两者都允许您将MyQueryType用作FromSql的目标:


只需确保SQL查询使用如上所示的别名返回预期的列名和类型。

我相信您可以将.Include放在FromSql之前,以包含相关表?我正在尝试使用.Include。var results=mContext.UserImage.Include u=>u.UsersFromSqlquery;但我只能访问UserImage表的属性@如果应用程序应该允许SQL injection,请提供要合并的表的示例。e、 至少有两个代表表的实体类示例。我编辑了文章并添加了两个示例。但它们没有任何共同之处——它们更像是JOIN而不是UNION的候选对象。我希望看到您在中使用的类。我尝试创建一个包含两个表中的属性的数据库集,即两个实体类和具有公共属性的类。我应该为UNIQUEIDENTIFIER选择什么?FromSql方法不允许查询特定列。。。这就是我为什么使用*非常感谢!这终于奏效了。我松了一口气。
modelBuilder.Query<MyQueryType>();
string query = $"SELECT Id, Path AS Text FROM UserImage WHERE UID == {UserId}"
    + $" UNION ALL SELECT Id, UserName AS Text FROM AspNetUsers";

var results = mContext.Query<MyQueryType>().FromSql(query);