it-source

Azure 테이블 저장소 행 키 제한된 문자 패턴?

criticalcode 2023. 6. 10. 09:25
반응형

Azure 테이블 저장소 행 키 제한된 문자 패턴?

Azure TableStorage RowKeys 내에 제한된 문자 패턴이 있습니까?수많은 검색을 통해 문서화된 문서를 찾을 수 없었습니다.그러나 일부 성능 테스트에서 이러한 행동이 나타나고 있습니다.

임의 문자로 구성된 RowKeys에서 이상한 동작이 발생했습니다(테스트 드라이버는 제한된 문자(/ \ # ?)와 RowKey에서 단일 따옴표가 발생하는 것을 방지합니다).결과적으로 RowKey가 테이블에 미세하게 삽입되지만 쿼리할 수 없습니다(결과적으로 InvalidInput).예:

RowKey: 9}5O0J=5Z,4,D,{!IKPE,~M]%54+9G0ZQ&G34!G+

이 RowKwy(동등)로 쿼리를 시도하면 오류가 발생합니다(앱 내에서 Azure Storage Explorer 및 Cloud Storage Studio 2 사용).Fiddler를 통해 전송되는 요청을 살펴보았습니다.

GET /foo()?$filter=RowKey%20eq%20'9%7D5O0J=5Z,4,D,%7B!IKPE,~M%5D%54+9G0ZQ&G34!G+' HTTP/1.1

행 키의 %54가 필터에서 이스케이프되지 않은 것 같습니다.흥미롭게도, 이 RowKey가 포함된 배치 XML의 URI를 포함하는 테이블 스토리지에 대한 배치 요청에 대해 유사한 동작을 확인했습니다.나는 또한 이중 따옴표가 포함된 RowKeys에 대한 유사한 동작을 본 적이 있지만, 아직 그 패턴을 분리하지는 않았습니다.

이런 행동을 본 사람이 있습니까?RowKeys에서 추가 문자가 발생하지 않도록 쉽게 제한할 수 있지만 '규칙'을 알고 싶습니다.

PartitionKey 및 RowKey 필드에는 다음 문자를 사용할 수 없습니다.

  • 슬래시(/) 문자
  • 백슬래시(\) 문자
  • 숫자 기호(#) 문자
  • 물음표(?) 문자

추가 읽기: AzureDocs > 테이블 서비스 데이터 모델 이해

public static readonly Regex DisallowedCharsInTableKeys = new Regex(@"[\\\\#%+/?\u0000-\u001F\u007F-\u009F]");

잘못된 테이블 파티션 및 행 키 탐지:

bool invalidKey = DisallowedCharsInTableKeys.IsMatch(tableKey);

잘못된 파티션 또는 행 키 검사:

string sanitizedKey = DisallowedCharsInTableKeys.Replace(tableKey, disallowedCharReplacement);

이 단계에서는 동일한 검사 값을 갖는 서로 다른 유효하지 않은 키의 잘못된 충돌을 방지하기 위해 검사 키(파티션 키 또는 행 키)를 원래 키의 해시로 접두사로 붙일 수도 있습니다.

문자열을 사용하지 마십시오.그러나 GetHashCode()는 동일한 문자열에 대해 다른 해시 코드를 생성할 수 있으며 고유성을 식별하는 데 사용되지 않으며 지속되지 않습니다.

SHA256을 사용합니다: https://msdn.microsoft.com/en-us/library/s02tk69a(v=vs.110).aspx

잘못된 키의 바이트 배열 해시를 만들려면 바이트 배열을 16진수 문자열로 변환하고 검사된 테이블 키 앞에 접두사를 붙입니다.

관련 MSDN 설명서도 참조하십시오. https://msdn.microsoft.com/en-us/library/azure/dd179338.aspx

링크의 관련 섹션:키 필드에 허용되지 않는 문자

PartitionKey 및 RowKey 속성 값에는 다음 문자를 사용할 수 없습니다.

슬래시(/) 문자

백슬래시(\) 문자

숫자 기호(#) 문자

물음표(?) 문자

U+0000에서 U+001F까지의 문자를 제어합니다.

  • 수평 탭(\t) 문자

  • 라인피드(\n) 문자

  • 캐리지 리턴(\r) 문자

U+007F에서 U+009F까지의 문자 제어

MSDN 기사에 언급된 문자 외에, 사람들이 문제가 있다고 언급하는 몇 곳에서 보았기 때문에 %char를 패턴에 추가했습니다.이 중 일부는 테이블 저장소에 액세스하는 데 사용하는 언어와 기술에 따라 달라집니다.

문제가 있는 문자가 추가로 발견되면 정규식 패턴에 추가할 수 있습니다. 다른 문자는 변경할 필요가 없습니다.

저는 방금 '+' 기호는 허용되지만 PartitionKey에서 쿼리할 수 없다는 것을 알게 되었습니다.

Igoreck의 답변에 나열된 문자 외에도 다음과 같은 문제가 발생할 수 있습니다(예: 삽입이 실패함).

  • |
  • []
  • {}
  • <>
  • $^&

Azure Node.js SDK로 테스트했습니다.

다음 기능을 사용하여 키를 변환합니다.

private static string EncodeKey(string key)
{
    return HttpUtility.UrlEncode(key);
}

물론 삽입과 검색을 위해 이 작업을 수행해야 합니다.

언급URL : https://stackoverflow.com/questions/11514707/azure-table-storage-rowkey-restricted-character-patterns

반응형