반응형

 

백오피스 운영 중 발생한 오류로

NAS 권한이 없는 직원이 NAS 에 파일 업로드하는 기능을 사용하여 오류가 발생했습니다.

NAS 권한은 없다보니 이미지는 옮겨지지 않고, DB만 서비스 DB 로 업데이트되어 대참사가 발생했습니다.

 

폴더 권한을 미리 체크하는 로직을 추가하여 오류를 해결했습니다.

샘플 코드는 아래와 같습니다.

 

공통함수로 만들어서 사용하였습니다.

실제 사용해보니 권한 체크 분기에서 걸리지는 않고 대부분 try catch 구문에서 예외가 발생해서 false로 리턴되네요.

 

using System;
using System.IO;
using System.Security.AccessControl;

class Program
{
    static void Main()
    {
        string folderPath = "경로\\폴더명"; // 확인하려는 폴더의 경로로 수정하세요

        if (CheckFolderPermissions(folderPath))
        {
            Console.WriteLine("폴더에 쓰기 권한이 있습니다.");
        }
        else
        {
            Console.WriteLine("폴더에 쓰기 권한이 없거나 확인할 수 없습니다.");
        }
    }

    static bool CheckFolderPermissions(string folderPath)
    {
        try
        {
            DirectorySecurity directorySecurity = Directory.GetAccessControl(folderPath);
            AuthorizationRuleCollection rules = directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));

            foreach (AuthorizationRule rule in rules)
            {
                FileSystemAccessRule fileSystemRule = rule as FileSystemAccessRule;
                
                if (fileSystemRule != null && (fileSystemRule.FileSystemRights & FileSystemRights.WriteData) != 0)
                {
                    return true; // 쓰기 권한이 있는 경우
                }
            }

            return false; // 쓰기 권한이 없는 경우
        }
        catch (UnauthorizedAccessException)
        {
            return false; // 예외가 발생하면 권한이 없는 것으로 간주
        }
    }
}

 

 

감사합니다.

반응형
반응형

 

외주 개발 인수 후 파일 업로드가 불가능하다는 CS를 받았습니다.

 

이미지 타입만 업로드가 가능하도록 했는데, JPG 파일이 업로드가 안된다는 문제였습니다.

 

확인해보니 파일의 확장자는 대문자 JPG인데, 확장자 체크는 소문자인 jpg로만 하고있었습니다.

 

사소한 실수이지만 확장자 체크 시 소문자, 대문자로 변환 후 체크해야합니다.

 

아래는 소문자로 체크하는 샘플 코드입니다.

    public static string GetImageTypeFromExtension(string imagePath)
    {
        string extension = Path.GetExtension(imagePath);
        if (string.IsNullOrEmpty(extension))
            return "Unknown";

        switch (extension.ToLower()) // ToLower() 소문자로 받아서 체크
        {
            case ".jpg":
            case ".jpeg":
                return "JPEG";
            case ".png":
                return "PNG";
            case ".gif":
                return "GIF";
            case ".bmp":
                return "BMP";
            default:
                return "Unknown";
        }
    }

 

감사합니다.

반응형
반응형

SQL Server 에서 오픈쿼리 사용 시 8000자를 넘어가면 실행이 불가능하다.

 

오픈쿼리 특성 상 테이블변수를 사용하지 못하기에 WHERE 절에서 IN 으로 조회하게 되는데

대상이 많아지면 8000자를 넘는일이 자주 발생한다.

 

예제

DECLARE @V_TABLE TABLE
(
	ORD_NO INT ,
	ORD_NAME VARCHAR(30)
)

DECLARE @QUERY NVARCHAR(MAX)
DECLARE @MULTI_ORD_NO NVARCHAR(MAX)


-- 1. 대상 테이블로 받을 때 행 별 콤마 추가
-- ex) 1,2,3
SELECT @MULTI_ORD_NO = STRING_AGG(CAST(ORD_NO AS NVARCHAR(MAX)), ',') FROM (SELECT ORD_NO FROM @V_TABLE) A

SET @QUERY = N'
SELECT 1 FROM A WHERE KEY IN ('+ @MULTI_ORD_NO +')
'

EXECUTE (@QUERY) AT LINKED_SERVER

 

참고로 STRING_AGG 할 때 꼭 NVARCHAR(MAX)로 캐스팅해서 써야 한다.

반응형

+ Recent posts