Program Language

728x90
반응형

C# 에서는 일반적으로 포인터를 사용하지 않지만, 간혹 C++ 에서 사용하던 Class를 가져오면서 포인터를 사용해야 하는 경우가 발생한다. 포인터를 사용하면 CLR에서 안전성을 책임지지 못하고, 불완전한 코드가 된다고 하며 에러를 발생하는데, 이렇게 예전 코드를 사용해야 할 경우, 빌드 속성을 변경해줌으로써 unsafe 코드를 사용 할 수 있다. 

 

 

1. 사용 방법

형식 또는 멤버 선언에서 unsafe 한정자를 사용할 수 있으며, 이렇게 선언해줄 경우 안전하지 않은 컨텍스트로 간주됩니다. 

 

unsafe private uint reload()
{
    uint s0 = 0, s1 = 0;
    int j = 0;

    fixed (uint* p0 = &mt_state[0])
    {
        uint* pS = p0;
        uint* p1 = p0;
        
        ... 중략 ...
    
        s1 = mt_state[0];
        s1 ^= (s1 >> 11);
        s1 ^= (s1 << 7) & 0x9D2C5680;
        s1 ^= (s1 << 15) & 0xEFC60000;
    }
    return (s1 ^ (s1 >> 18));
}

 


 

2. fixed 키워드

fixed 지시어는 unsafe 컨텍스트에서만 허용 됩니다. 

클래스가 인스턴스화 되면  CLR에 의해 언제든지 메모리가 이동 될 수 있는데, fixed 지시어를 이용하면 해당 코드에 들어간 변수 및 객체는 가비지 콜렉팅이 발생할 때 주소 재배치 대상이 아니게 됩니다.

 


 

3. 빌드 속성

unsafe 한정자를 사용할 경우에는 안전하지 않은 코드 허용(F) 를 체크해야지만, 빌드 오류가 나지 않습니다. 

728x90
728x90
반응형

 

SQL Injection 이란 Web hacking 기법 중 하나입니다.

웹 애플리케이션의 뒷단에 있는 Database에 쿼리를 보내는 과정 사이에 일반적인 값 외에 악의적인 의도를 갖는 구문을 삽입하여 공격자가 원하는 SQL 쿼리문을 실행하는 기법입니다. 

주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑 하지 못했을 경우에 발생하며, 요즘의 거의 모든 데이터베이스 엔진은 유저 입력이 의도치 않은 동작을 하는 것을 방지하기 위해 Escape 함수와 Prepared Statement를 제공한다.

 

SQL Injection 공격의 종류

  • 인증 우회 (AB : Auth ByPass)
  • 데이터 노출 (DD : Data Disclosure)
  • 원격 명령 실행 (RCE : Remote Command Excute)

 

인증 우회

아이디와 패스워드를 입력하는 로그인 페이지를 타겟으로 행해지는 공격

SQL 쿼리문의 true / false 의 논리적 연산 오류를 이용하여, 로그인 인증 쿼리문이 무조건 true 결과값이 나오게 하여 인증을 무력화 시키는 원리

[ 외부 입력값 ]
ID : admin'--
Password : 1234

[ 실행되는 쿼리문 ]
Select * From Users Where ID = 'admin'-- And Password = '1234'

 

데이터 노출

타겟 시스템의 주요 데이터 절취를 목적으로 하는 방식이다. Error based, Union based, Blind based, Time based 방식이 있다. 시스템의 에러는 개발자에게 버그를 수정하는 면에서 많은 도움을 주지만 역으로 에러를 이용할 수 있다. 악의적인 구문을 삽입하여 에러를 유발시키는 것이다.

해커는 GET 방식으로 동작하는 url에 추가적인 `query string`을 추가하여 에러를 발생시킬 수 있다. 이에 해당하는 오류가 나타난다면 그것을 가지고 데이터베이스의 구조를 유추할 수 있다. 그렇기 때문에 오류 페이지 또는 오류 메시지가 노출되어서는 안된다.

 

 

매개 변수화 된 쿼리를 사용하는 것은 3 단계 프로세스입니다.

  1. 매개 변수를 사용하여 SqlCommand 명령 문자열을 구성하십시오.
  2. 적절한 값을 할당하여 SqlParameter 개체를 선언하십시오.
  3. SqlParameter 개체를 SqlCommand 개체의 Parameters 속성에 할당하십시오.

SqlCommand와 SqlParameter를 사용하면 SQL_Injection에서 안전하게 코드를 작성할 수 있다.
SqlParameter 객체를 통해 전달되는 값은 쿼리에 영향을 끼치지 못하는 문자열로만 인식이 된다.
a or 1=1 -- 이런 코드도 "a or 1=1 --" 식의 문자열로 인식된다.
이런 방식을 Parameterized Query라고 함!

 

 

SqlConnection sCon = new SqlConnection("Data Source=000.000.000.000,1433;Initial Catalog=TestDB;User ID=admin;Password=password;Min Pool Size=5;Max Pool Size=100;Connect Timeout=5;Packet Size=8192");
sCon.Open();

SqlCommand sqlCom = new SqlCommand();
sqlCom.Connection = sCon;

sqlCom.CommandText = "select * from AccountTable where user_name=@userName and user_id=@userID";
sqlCom.CommandType = CommandType.Text;

sqlCom.Parameters.Add(new SqlParameter("@userName", SqlDbType.VarChar, 50)).Value = userName.Text;
sqlCom.Parameters.Add(new SqlParameter("@userID", SqlDbType.VarChar, 50)).Value = userID.Text;

SqlDataReader reader = sqlCom.ExecuteReader();
sCon.Close();

 

 

 

안전한 방식으로 쿼리를 필터링하려면 매개 변수를 사용해야합니다. 

매개 변수를 사용하는 프로세스에는 세 가지 단계가 있습니다.

SqlCommand 명령 문자열에 매개 변수를 정의하고 해당 속성을 사용하여 SqlParameter 개체를 선언하고

SqlParameter 개체를 SqlCommand 개체에 할당합니다. 

SqlCommand가 실행될 때 매개 변수는 SqlParameter 개체에 지정된 값으로 바뀝니다.

 

 

728x90
728x90
반응형

 

C# 에서 const 와 readonly는 상수형 타입입니다. 보다 자세히 말씀드린다면,

const는 컴파일 타입의 상수이며, readonly는 런타임 상수입니다.

 


const

  • 컴파일 타입의 상수이다. (컴파일 시 const 변수의 값을 가져온다.)
  • 내장자료형 (정수형, 실수형, Enum, String)에 대해서만 사용 할 수 있다.
  • 변수 선언과 동시에 값을 할당 해야 한다.
  • 메모리 할당 위치는 Stack Memory 이다. 단, static 선언을 하면 Heap Memory에 저장 가능하다.

 


 

readonly

  • 런타임 상수이다. (exe 또는 dll을 사용할 때 변수의 값을 가져온다.)
  • 모든 자료형에 사용 할 수 있으며, 생성과 동시에 초기화 할 필요는 없다.
  • 단, 생성자 단계에서 단 1번 할당을 통해 초기화 할 수 있다. 
  • 메모리 할당 위치는 Heap Memory이다.

 


왜 const 보다 readonly가 더 좋은가?

const는 Stack Memory에 저장 되기 때문에 접근이 빠르다는 장점이 있지만, 

const는 컴파일 상수이기 때문에, const 변수 값이 바뀌는 경우 해당 프로젝트 뿐만 아니라 참조 받거나 영향을 받는 프로젝트 모두 재 컴파일을 해야 하는 단점이 있다.

 

반면, readonly는 생성시 선언하지 않아도, 생성자에서 초기화 하여 사용 할 수 있기 때문에 유연하며, 실제 사용하는 단계에서 변수의 값을 가져오는 장점이 존재한다.

 

 

상수값 변경시 재 컴파일을 하지 않고, 사용하는 생성자 단에서 변수에 값을 할당해서 사용 할 수 있기 때문에

const 보다는 readonly의 사용을 좀 더 고려해볼 필요가 있다.

 

 

 

728x90
728x90
반응형

 

개발자마다 각자의 코딩 스타일이 존재합니다. 다수의 개발자들이 모여 팀 단위로 프로젝트를 진행한다면 코딩 컨벤션 정도는 사전에 맞추고 진행하는 것이 도움이 됩니다. 

또한 코딩 스타일에 대한 정형화 역시 사전에 맞추고 진행하면 다른 개발자들이 소스를 봐도 큰 어색함 없이 작업이 가능한 장점이 있습니다. 이를 위해 강제성을 부여해야 한다고 저는 생각하는데요.

이때 VisualStudio의 setting 파일을 이용해서 작업을 진행해도 되지만, 신규 입사자가 생길경우 해당 셋팅작업이 누락되는 경우 강제성을 부여한 코딩 스타일이 어긋나게 됩니다. 

이를 대비하기 위해 프로젝트에 종속 시켜서 코딩 규칙을 정형화하는 것이 좋으며, EditorConfig를 이용하는 방법을 정리했습니다.

 

 


 

EditorConfig 파일 생성

Solution 에 해당 파일을 추가합니다.

진행하고 있는 프로젝트 솔루션에 새파일을 추가하여 줍니다. 이때 템플릿은 editorconfig 파일로 추가 해 줍니다. 

저는 .NET 스타일로 진행하였습니다. 

 

 


 

EditorConfig 파일 설정

해당 파일을 셋팅하는 것에 대해서 다소 어려움이 있으실 수 있지만, 

아래 링크에 각 변수들이 어떠한 역활을 하는지 잘 설명되어 있습니다. 

저는 Visual Studio 2017 에서 작업 하였기 때문에 이에 맞는 규칙으로 설정하였습니다. 

 

 

 

https://docs.microsoft.com/ko-kr/visualstudio/ide/editorconfig-code-style-settings-reference?view=vs-2017

 

EditorConfig에 대한 .NET 코딩 규칙 설정 - Visual Studio

EditorConfig에 대한 .NET 코딩 규칙 설정.NET coding convention settings for EditorConfig 이 문서의 내용 --> EditorConfig 파일을 사용하여 코드베이스에서 일관된 코드 스타일을 정의하고 유지 관리할 수 있습니다.You can define and maintain consistent code style in your codebase with the use of an EditorConfig file

docs.microsoft.com

 

 

 

 

 

 

728x90

[C#] SonarQube - 정적분석

2020. 1. 29. 19:48
728x90
반응형

 

개발을 할때 단순히 기능만 동작하는 코드를 만드는 것뿐만 아니라, 읽기 좋은 코드를 작성하려고

팀내에서 정형화된 코딩 규칙을 이용해 유지보수하기 좋은 코드 등을 만들기 위해 많은 노력을 합니다. 이를 위해 코드 리뷰 등을 통해 동료 개발자들이 직접 검토하는 경우도 있지만 정형화된 패턴에 대해서는 소스 코드를 분석해주는 도구를 이용할 수 있다. 이러한 것을 코드 정적 분석이라고 합니다.

 

몇가지 툴을 찾아본 결과 아래 SonarQube 라는 툴을 사용해보기로 하였습니다.

 

 

https://www.sonarsource.com/

 

Code Quality and Security | Developers First | SonarSource

Products First Our prime focus and dedication is in building great products that have an impact and are loved by their users. Developer-first Offering Our offering is built to first empower developers with code quality & security tooling, and then enable t

www.sonarsource.com

 


 

Visual Studio 설치

1. Visual Studio 설치 시 Market Place를 이용해서 설치 하였습니다. 도구 > 확장 및 업데이트 메뉴를 선택합니다. 

 

 

2.이후 나타나는 창에서 SonarLint 를 검색해 줍니다. 

 

 

3. 자세한 설치 방법은 아래 링크를 이용해 주세요.

https://improveandrepeat.com/2017/12/integrate-sonarqube-with-visual-studio-using-sonarlint/

 

Integrate SonarQube with Visual Studio using SonarLint

If you follow along with the last few posts on SonarQube, you will now have a working installation that continuously monitors the quality of your code. Today we link Visual Studio to SonarQube usin…

improveandrepeat.com

 


 

정적분석 적용 및 역활

SonarLint를 적용시키고, 현재 진행중인 프로젝트에 적용했을때 보여지는 경고 리스트 입니다. 

여러가지가 보여지네요.

SonarLint 에서는 경고를 띄우지만, 내부에서 결정한 코딩 규칙이 있다면, 무시하고 진행하시면 될 것 같습니다. 

 

자세한 내용은 아래 링크를 통해서 어떠한 내용을 분석해 주는지 확인하면 좋을 것 같습니다. 

https://rules.sonarsource.com/csharp

 

Rules explorer

 

rules.sonarsource.com

 

 

 

 

 

 

 

 

 

728x90
728x90
반응형

 

PHP를 이용해서 개발해보신 분들은 아시겠지만, 암호화 방법중에 기본적으로 이용하는 방식이 MD5를 이용해서 암호화 하는 방식입니다.

이번에 PHP로 개발되어 있는 사이트를 .NET Core 3.1 로 변경하는 도중, 비밀번호를 MD5를 이용해서 암호화한 부분이 있어서 C#으로 대체해보았습니다.

 


MD5 클래스

네임스페이스 : System.Security.Cryptography

위 네임스페이스에 정의 되어 있으며, 

MD5 해시 알고리즘의 모든 구현이 상속될 추상 클래스를 나타냅니다.

 

static string GetMd5Hash(MD5 md5Hash, string input)
{
    // Convert the input string to a byte array and compute the hash.
    byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

    // Create a new Stringbuilder to collect the bytes
    // and create a string.
    StringBuilder sBuilder = new StringBuilder();

    // Loop through each byte of the hashed data 
    // and format each one as a hexadecimal string.
    for (int i = 0; i < data.Length; i++)
    {
        sBuilder.Append(data[i].ToString("x2"));
    }

    // Return the hexadecimal string.
    return sBuilder.ToString();
}

MSDN에 정의되어 있는 Sample 예제입니다.

위 예제만 이용하면 손쉽게 MD5를 암호화 해서 사용할 수 있습니다.

 

 

static void Main(string[] args)
{
    var mdHash = MD5.Create();
    string password = "1111";
    Console.WriteLine(GetMd5Hash(mdHash, password));
}


// 결과값
b59c67bf196a4758191e42f76670ceba

MD5.Create() 메소드를 이용해서, System.Security.Cryptography.MD5 해시 알고리즘의 기본 구현 인스턴스를 만들어 줄 수 있습니다. 이를 기반으로 지정된 바이트의 Hash값을 계산해서 사용하게 됩니다. 

 

 


자세한 내용은 아래 MSDN링크를 확인해주세요.

https://docs.microsoft.com/ko-kr/dotnet/api/system.security.cryptography.md5?view=netframework-4.8
728x90

+ Recent posts