c# - 在 asp.net mvc 中检查上传的 Excel 文件中的非法字符

标签 c# asp.net asp.net-mvc excel linq-to-excel

我正在使用 asp.net MVC 4 创建一个网站,用户可以在其中上传 .xlsx 文件并将数据保存到 MSSQL 表中。我想在保存数据之前确保文件中没有非法字符,例如SQL注入(inject)语句。到目前为止,我用 $ 符号测试它工作正常,但它只会在单元格只有那个字符而不是字符之间时捕获。这是我的代码,

Controller

    public ActionResult BulkReadings()
    {
        string pathToExcelFile = System.IO.Path.Combine(Server.MapPath("~/ExcelFiles/"), "BulkReads.xlsx");
        string sheetName = "Sheet1";

        var excelFile = new ExcelQueryFactory(pathToExcelFile);
        var getSheet = from a in excelFile.Worksheet(sheetName) select a;
        string Subject = "";
        string Type = "";
        string Reading = "";

        foreach (var a in getSheet)
        {
            if (a["Subject"] == "$" || a["Type"] == "$" || a["Reading"] == "$")  // This is where it checks for the "$" sign
            {
                if (System.IO.File.Exists(pathToExcelFile))
                {
                    System.IO.File.Delete(pathToExcelFile);
                }
                TempData["meter_fail"] = "Error! Illegal Characters!";
                return RedirectToAction("MeterManager");
            }
            else
            {
                Subject = a["Subject"];
                Type = a["Type"];
                Reading = a["Reading"];
                try
                {
                    Reading newEntry = new Reading();
                    newEntry.title = Subject;
                    newEntry.type = Type;
                    newEntry.reading1 = Reading;
                    rentdb.Readings.Add(newEntry);
                }
                catch
                {
                    if (System.IO.File.Exists(pathToExcelFile))
                    {
                        System.IO.File.Delete(pathToExcelFile);
                    }
                    TempData["meter_fail"] = "Error! Upload Failed!";
                    return RedirectToAction("MeterManager");
                }
            }
        }
        rentdb.SaveChanges();
        if (System.IO.File.Exists(pathToExcelFile))
        {
            System.IO.File.Delete(pathToExcelFile);
        }
        TempData["meter_success"] = "Reading(s) uploaded successfully!";
        return RedirectToAction("MeterManager");
    }

如何检查单元格中可以作为单个字符或与其他字符一起出现的多个非法字符?

最佳答案

正如@Sam Ax 所说,避免 sql 注入(inject)攻击的最佳方法是参数化您的查询。参数是值的占位符,而不是使用用户输入的值。

例如:

using (SqlConnection conn = new SqlConnection(NorthwindConnectionString))
{
    string query = "SELECT * FROM Products WHERE ProductID = @Id";
    SqlCommand cmd = new SqlCommand(query, conn);
    cmd.Parameters.AddWithValue("@Id", Request.QueryString["Id"]);
    conn.Open();
    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        DetailsView1.DataSource = rdr;
        DetailsView1.DataBind();
    }
}

这里有一些进一步的阅读: https://msdn.microsoft.com/library/bb738521(v=vs.100).aspx

关于c# - 在 asp.net mvc 中检查上传的 Excel 文件中的非法字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35237706/

相关文章:

c# - session 变量无法更新

c# - 在每行开头之前添加空格(字符串的第一行除外)?

asp.net - System.Addin - 创建安全的 ASP.NET MVC 插件

c# - 如何专门将 LongRunning 标志传递给 Task.Run()?

c# - 用于字符串比较的可忽略字符列表

javascript - Asp.Net 的 Javascript 中的 Node.js 代码

asp.net-mvc - Asp.NET MVC 强类型 Controller

c# - ASP.NET MVC - 模型绑定(bind)不同实体中具有相同名称的多个参数 - GET 和 POST 不同吗?

c# - 如何在 C#.NET 中替换现有 XML 文件的内容?

asp.net - 在发布/部署期间将 DateTime.Now 插入 Web.Config