복붙노트

[SQL] 어떻게 SQL 매개 변수를 전달하고, 내가 필요한 이유는 무엇입니까?

SQL

어떻게 SQL 매개 변수를 전달하고, 내가 필요한 이유는 무엇입니까?

여기 초급 :

SQL 서버에 데이터를 삽입하는 방법에 내 질문이 대답에 그는 내가 현재 가지고있는 것처럼 대신 문자열 연결의 매개 변수를 전달 언급했다.

이 보안을 위해 꼭 필요한가요? 이 경우, 정확히 어떤 매개 변수를 전달합니까? 내가 그것을 구글 언제 저장 프로 시저에 대해 많은 것을 얻을. 내가 원하는, 내가 아직 .... 저장 프로 시저에 대해 모르는입니다.

당신이 올바른 방향으로 날 지점 수 있다면, 나는 그것을 감사하겠습니다.

감사.

편집하다:

좋아, 여기에 내가 가진 것입니다. 정확하게 데이터베이스를 업데이트 할 것 같다 결국 나는 레이블에서 입력에 하드 코딩의 int 변경됩니다. 내가 한 방법이 어떤 SQL 주입 또는 해킹에 취약하지 않은 경우 확인하시기 바랍니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;



public partial class Stats : System.Web.UI.Page
{

    public SqlDataReader DataReader;
    public SqlCommand Command;
    string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES (@UID, @CL, @LL, @HL);");
    //string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES ('a051fc1b-4f51-485b-a07d-0f378528974e', 2, 2, 2);"); 

    protected void Page_Load(object sender, EventArgs e)
    {
       LabelUserID.Text = Membership.GetUser().ProviderUserKey.ToString();

    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        //connect to database
        MySqlConnection database = new MySqlConnection();
        database.CreateConn(); 

        //create command object
        Command = new SqlCommand(queryString, database.Connection);

        //add parameters. used to prevent sql injection
        Command.Parameters.Add("@UID", SqlDbType.UniqueIdentifier);
        Command.Parameters["@UID"].Value = Membership.GetUser().ProviderUserKey;

        Command.Parameters.Add("@CL", SqlDbType.Int);
        Command.Parameters["@CL"].Value = 9;

        Command.Parameters.Add("@LL", SqlDbType.Int);
        Command.Parameters["@LL"].Value = 9;

        Command.Parameters.Add("@HL", SqlDbType.Int);
        Command.Parameters["@HL"].Value = 9;

        Command.ExecuteNonQuery(); 


    }

}

해결법

  1. ==============================

    1.SQL 매개 변수를 전달하는 것은 동적 SQL 문자열을 구축 할 필요가 당신을 절약 할 수 있습니다.

    SQL 매개 변수를 전달하는 것은 동적 SQL 문자열을 구축 할 필요가 당신을 절약 할 수 있습니다.

    사람들이 응용 프로그램에 자신의 SQL 코드를 삽입 가능한 데이터에 대해 바람직하지 않은 명령을 실행 할 수 있기 때문에 동적 SQL 문을 구축하는 것은 거대한 보안 위험이 있습니다.

    에서 가능한 SQL 주입 공격의 좋은 샘플이 있습니다 :

    예에 의한 SQL 인젝션 공격

    SQL 문에 매개 변수를 전달하는 방법에는 두 가지가 있습니다. 하나는 당신이 언급 한 같은 저장 프로 시저 사용하는 것입니다. 다른 하나는 (내가 무엇을 선호 실제로있는) 매개 변수화 된 쿼리를 사용하는 것입니다.

    매개 변수가있는 쿼리는 .NET에서 아주 쉽게 실제로 :

    using(SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand command = 
            new SqlCommand("SELECT * FROM Users WHERE Username = @Username", conn);
    
        command.Parameters.Add(new SqlParameter("@Username", "Justin Niessner"));
    
        SqlDataAdapter adapter = new SqlDataAdapter(command);
        DataTable dt = new DataTable();
    
        adapter.Fill(dt);
    }
    

    이 예에서, 매개 변수는 @username 그리고 우리는 값 전달할 SqlCommand 개체의 매개 변수 집합을 사용했다.

  2. ==============================

    2.그것은 작은 바비 테이블에서 당신을 보호 할 수 있습니다.

    그것은 작은 바비 테이블에서 당신을 보호 할 수 있습니다.

    http://xkcd.com/327/

  3. ==============================

    3.다음은 그 예이다 :

    다음은 그 예이다 :

            SqlConnection myConn = new SqlConnection("my connection string");
    
            SqlCommand myCmd = new SqlCommand("myStoredProcName", myConn);
    
            myCmd.CommandType = CommandType.StoredProcedure;
    
            myCmd.Parameters.AddWithValue("@cGroupID", 0).Direction = ParameterDirection.InputOutput;
            myCmd.Parameters.AddWithValue("@gType", "C");
            myCmd.Parameters.AddWithValue("@requirement", "Y");
            myCmd.Parameters.AddWithValue("@usercode", "XX");
    
            myConn.Open();
            myCmd.ExecuteNonQuery();
    
            int covID = (int)myCmd.Parameters["@cGroupID"].Value;
    

    매개 변수를 사용하면 몇 가지 오류를 방지하는 좋은 방법, 도움 정지 주입 벡터이다. 또한 cGroupID 다시 I가 액세스 할 수있는 값이 오는 곳 위의 예에서와 같이, 출력 매개 변수를 할 수 있습니다.

  4. ==============================

    4.단순히 합치 문자열의 주요 문제는 종종 SQL 인젝션 공격에 당신이 취약 것입니다.

    단순히 합치 문자열의 주요 문제는 종종 SQL 인젝션 공격에 당신이 취약 것입니다.

    구글 SQL 인젝션은 나 여기 읽어 보시기 바랍니다.

  5. ==============================

    5.SQL 주입과 같은뿐만 아니라, 매개 변수가있는 쿼리는 항상 SQL 서버에 같은 모양. 대부분의 경우 쿼리 실행 계획은 당신이 빠르게 실행됩니다 다시 같은 쿼리를 보내 그렇다면, 캐시됩니다. 루프에서 동일한 쿼리를 여러 번 실행하는 경우 이것은 매우 눈에 띄는 것 또는 당신은 당신의 서버를 쿼리 많은 클라이언트가 있습니다.

    SQL 주입과 같은뿐만 아니라, 매개 변수가있는 쿼리는 항상 SQL 서버에 같은 모양. 대부분의 경우 쿼리 실행 계획은 당신이 빠르게 실행됩니다 다시 같은 쿼리를 보내 그렇다면, 캐시됩니다. 루프에서 동일한 쿼리를 여러 번 실행하는 경우 이것은 매우 눈에 띄는 것 또는 당신은 당신의 서버를 쿼리 많은 클라이언트가 있습니다.

  6. from https://stackoverflow.com/questions/3216233/what-is-passing-parameters-to-sql-and-why-do-i-need-it by cc-by-sa and MIT license