簡體   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