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
'source' 카테고리의 다른 글
java.io의 자바에서의 mkdir()와 mkdirs()의 차이.파일 (0) | 2022.11.15 |
---|---|
Python 클래스가 개체를 상속하는 이유는 무엇입니까? (0) | 2022.11.15 |
자산 폴더에서 ListView로 로컬 JSON 파일을 해석하려면 어떻게 해야 합니까? (0) | 2022.11.15 |
Vue.js - 요소 UI - 폼 검증 regexp (0) | 2022.11.15 |
판다의 다른 컬럼을 기준으로 컬럼 값 추출 (0) | 2022.11.15 |