繁体   English   中英

有关SQL注入和参数化查询的问题

[英]Questions about SQL injection and Parameterised Queries

我正在Visual Studio中基于表单的可视C#项目中工作。 它把输入输入到C#表单中,文本框更新我们的mysql服务器,并在加载表单时从数据库中加载数据库中的现有值。

我是CSUS的学生,该项目是我对软件工程课程的介绍的一部分。 我和我的团队已经自学了C#和SQL以完成该项目,因此我们所做的几乎每件事都不完全正确或非常糟糕。 我最近发现了SQL注入,并正在尝试编写我的应用程序来防止它。 我读到我需要使用准输入,但是我在语法上有些挣扎。 我发现的大多数示例似乎都假定我对C#或SQL有更多的了解,并且它们显示了正确的语法,而没有许多如何将其从不良类型转换的示例。

下面的代码是我们在程序中经常使用的查询类型的简化示例。 PDFExporter是我创建的一个库,它具有一个包含一些字符串常量的globalvariable类,其中一个是我们的sql server连接字符串。 可以为我带来很多帮助的是使用参数编写的类似SQL查询的示例,任何提示或注释将不胜感激。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
//.
//.
//.

string column = "FR18_ClientID, ClientDSMIV, ClientPCounselor, ClientMethPayInt;
        string values = "'" + client + "', + '" + DSMIV.Text + "', + '" + PCounselor.Text + "', + '" + PaymentMethod.Text + "'";
        string onupdate = "FR18_ClientID = VALUES(FR18_ClientID) , ClientDSMIV = VALUES(ClientDSMIV), ClientPCounselor = VALUES(ClientPCounselor), ClientMethPayInt = VALUES(ClientMethPayInt);
        MySqlConnection con = null;
        con = new MySqlConnection(PDFExporter.GlobalVar.SERVER);
        con.Open();

            MySqlCommand command = con.CreateCommand();
 command.CommandText = "INSERT INTO FR18_Bookkeeping (" + column + ")" + " VALUES(" + values + ")ON DUPLICATE KEY UPDATE " + onupdate;   
        command.ExecuteNonQuery();
        con.Close();

我们的程序也有很多select语句,但是我们用来查询数据库的值是一个内部值,用户输入不会设置或更改它。 一个简单的例子可能是

string autofill = " SELECT * FROM FR18_Bookkeeping WHERE FR18_ClientID = " + client;

客户端永远不会由用户设置,它几乎是我们所有表的前键。 是否有必要对此查询进行参数化?

参数不仅与sql注入有关,尽管这无疑是非常重要的用法(坦率地说,即使对于内部数据,我仍然会担心sql注入),但参数还有其他优点:

  • 查询计划缓存/重复使用
  • 数据类型正确性(避免使用格式i18n,l10n等的问题-尤其是在字符串日期和数字时)
  • 数据内容的正确性-例如,当您需要存储客户名称O'Brien

我强烈建议您使用参数。 如果使用“ dapper”之类的工具,则不必太复杂。 例如:

int client = ...
var rows = conn.Query<Bookkeeping>(
    "SELECT * FROM FR18_Bookkeeping WHERE FR18_ClientID = @client",
    new { client }).ToList();

完全参数化,没有任何痛苦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM