如何使用Entity Framework Core

时间:2019-04-05 21:23:52

标签: c# ajax sqlite entity-framework-core

我正在为一个Web应用程序编写程序,该程序具有针对CTF竞争的故意实现的漏洞,并且我将ASP.NET Core和Entity Framework Core与SQLite数据库一起使用。我想使SQL注入成为可能,为此,我需要以某种方式用并集语句查询多个表上的数据库。

不幸的是,我的所有尝试都导致错误消息。后端控制器通过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表进行查询。我没有找到查询两个表的方法。我尝试创建一个由两个表中的属性组成的DbSet,但这也不起作用。

这是客户端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
路径= 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
EmailConfirmed = 1
PasswordHash = uRGWeGWq5ZorrzgNvSuz8Q ==
SecuritySamp = RBCZDCBA3IEMPET2ZCL4MVCXW3IA3H4C
ConcurrencyStamp = 0b8873cc-ecfe-4280-a6bf-0f354242f4a4
PhoneNumber = NULL
PhoneNumberConfirmed = 0
TwoFactorEnabled = 0
LockoutEnd = 0
LockoutEnabled = 0
AccessFailedCount = 0
AvatarImage =图片/avatar.jpg
盐= 4r1rtuji0cc
IsAdmin = 0

2 个答案:

答案 0 :(得分:1)

  

我没有找到查询两个表的方法。我试图创建一个由两个表中的属性组成的DbSet,但这也行不通。

不知道到底是什么“没用”,但这是要走的路。但是,与其创建包含公用属性的类的DbSet,而不是告诉EF对待一个实体,而是创建DbQuery或简单地将该类注册为query type

例如:

public class MyQueryType
{
    public Guid Id { get; set; }
    publc string Text { get; set; }
}

在您的DbContext类中,或者:

public DbQuery<MyQueryType> MyQueryType { get; set; }

或(在OnModelCreating内部覆盖):

modelBuilder.Query<MyQueryType>();

两者都将允许您将MyQueryType用作FromSql的目标:

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);

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

答案 1 :(得分:0)

尝试此查询:

string query = $"SELECT * FROM UserImage WHERE UID == convert(UNIQUEIDENTIFIER, convert(varchar(max),{UserId}))";

我想强调的是,使用*并不是很好,*最好使用列。