source

URL에서 base64로 인코딩된 문자열 전달

factcode 2022. 11. 15. 21:30
반응형

URL에서 base64로 인코딩된 문자열 전달

GET 파라미터를 통해 raw base64 부호화 스트링을 전달해도 안전한가요?

기타 Base64 사양이 있습니다(자세한 내용은 여기를 참조하십시오).단, 부호화에는 기본적으로 65자가 필요합니다.소문자 26 + 대문자 26 + 10자리 = 62 입니다.

['+', '/' 두 개와 패딩 문자 '='가 더 필요합니다.단, 어느 것도 URL 친화적이지 않으므로 다른 문자를 사용하면 됩니다.위 차트의 표준 문자는 [-', '_'이지만, 같은 디코딩으로 다른 문자와 공유할 필요가 없다면 다른 문자를 사용할 수 있습니다.

직접 도우미를 써보는 게 좋을 것 같아요.base64_encode에 대한 php 매뉴얼 페이지의 코멘트에서 다음과 같이 입력합니다.

function base64_url_encode($input) {
 return strtr(base64_encode($input), '+/=', '._-');
}

function base64_url_decode($input) {
 return base64_decode(strtr($input, '._-', '+/='));
}

아니요, base64 문자열에는 데이터의 의미를 바꿀 수 있는 "+", "=" 및 "/" 문자가 포함될 수 있으므로 하위 폴더처럼 보일 수 있습니다.

유효한 base64 문자는 다음과 같습니다.

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

@joeshmo 또는 도우미 함수를 쓰는 대신 base64 인코딩된 문자열을 urlencode할 수 있습니다.도우미 기능과 동일한 기능을 수행하지만 2개의 추가 기능은 필요하지 않습니다.

$str = 'Some String';

$encoded = urlencode( base64_encode( $str ) );
$decoded = base64_decode( urldecode( $encoded ) );

개요: 여기 있는 답변 중 일부는 오해의 소지가 있기 때문에 몇 가지 설명을 투고하고 싶습니다.

정답은 NO입니다.플러스 기호는 $_GET 글로벌 어레이 내의 SPACE로 변환되기 때문에 URL 쿼리 문자열 내에서 base64로 인코딩된 파라미터를 단순히 전달할 수 없습니다.즉, test.php?myVar=stringwith+sign을 전송한 경우

//test.php
print $_GET['myVar'];

결과는 다음과 같습니다.
stringwith sign

이 문제를 해결하는 쉬운 방법은 단순하게urlencode()쿼리 문자열에 추가하기 전에 base64 문자열을 사용하여 +, = 및 / 문자를 %## 코드로 이스케이프합니다.예를 들어.urlencode("stringwith+sign")돌아온다stringwith%2Bsign

액션을 처리할 때 PHP는 $_GET global을 입력하면 쿼리 문자열을 자동으로 디코딩합니다.예를 들어 test.php?myVar=string with%2Bsign을 다음 주소로 전송한 경우

//test.php
print $_GET['myVar'];

결과는 다음과 같습니다.
stringwith+sign

하고 싶지 않다urldecode()+로 반환된 $_GET 문자열은 공백으로 변환됩니다.
즉, 같은 test.php?myVar=string with %2Bsign을 전송한 경우

//test.php
$string = urldecode($_GET['myVar']);
print $string;

결과는 예상 밖입니다.
stringwith sign

입력에는 안전하지만 중복되므로 불필요합니다.

한마디로 이야기할 수 없군요.

경우에 따라서는 base64의 기본 문자 집합이 URL에서 사용되는 기존 규칙과 충돌할 수 있습니다.그러나 많은 base64 구현에서는 URL과 더 잘 일치하도록 문자 집합을 변경하거나 Python과 같은 문자 집합을 사용할 수 있습니다.

또 다른 문제는 URL 길이의 제한, 즉 URL 길이의 부족입니다.표준에는 최대 길이가 지정되어 있지 않기 때문에 HTTP 프로토콜로 작동하는 브라우저, 서버, 라이브러리 및 기타 소프트웨어는 자체 제한을 정의할 수 있습니다.

이것은 base64url 인코딩으로, 위의 joeshmo 코드를 확장한 것입니다.

function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}

예를 들어 "=" 문자는 raw base 64에서 사용되며 HTTP GET에서 매개 변수와 값을 구별하는 데에도 사용되므로 안전하지 않다고 생각합니다.

데이터를가 있는 를 할 수 .sodium_bin2base64 varianturl safe variant를 할 수 입니다.

예를 들어 다음과 같이 인코딩할 수 있습니다.

$string = sodium_bin2base64($binData, SODIUM_BASE64_VARIANT_URLSAFE);

및 디코딩:

$result = sodium_base642bin($base64String, SODIUM_BASE64_VARIANT_URLSAFE);

사용방법에 대한 자세한 내용은 php 문서를 참조하십시오.

https://www.php.net/manual/en/function.sodium-bin2base64.php https://www.php.net/manual/en/function.sodium-base642bin.php

이론적으로는 클라이언트 또는 서버의 최대 URL 및/또는 쿼리 문자열 길이를 초과하지 않는 한 그렇습니다.

실제로, 상황은 좀 더 까다로워질 수 있다.예를 들어 HttpRequestValidation을 트리거할 수 있습니다.ASP의 예외입니다.값에 "on"이 포함되어 있고 후행 "=="가 있는 경우 NET.

encode의 url safe encode, url safe encode 입니다.base64.urlsafe_b64encode(...)에서는 100%Python을 할 수 있습니다.

function base64UrlSafeEncode(string $input)
{
   return str_replace(['+', '/'], ['-', '_'], base64_encode($input));
}

언급URL : https://stackoverflow.com/questions/1374753/passing-base64-encoded-strings-in-url

반응형