1

これについては、さまざまな形ですでに数十の質問があることを私は知っています。私の質問はもう少し直接的です。

Free Pascal と s:=DecodeStringBase64(s); の使用 s として渡されるデコードされた文字列が、デコードされたガベージを回避するために、最初に適切な Base64 入力データから実際にデコードされているかどうかを検証する方法はありますか?

私が行った最善の方法は、正規表現を使用して潜在的なBase64データを特定することです(ここで受け入れられた回答から)。次に、mod を使用して 4 で割り切れるかどうかを確認します。4 で割り切れる場合は、DecodeStringBase64 に渡します。ただし、正規表現と一致しているにもかかわらず、まだ多くの誤検知が発生し、「デコード」されたデータが返されましたが、最初は明らかに Base64 ではありませんでした。たとえば、「WindowsXP=」は式に一致しますが、Base64 でエンコードされたデータではありません。

同様に、「Ted」という名前は VGVk としてエンコードされ、通常の「=」パディング (フッターとしてフラグを立てるのに役立ちます) さえありませんが、それでも見つけてデコードしたい潜在的な Base64 フラグメントです。

PHP には、検証を支援するために true パラメーターを渡すことができるbase64_decode()があります。

私の知る限り、Free Pascal には DecodeStringBase64 ではこれがなく検証する方法が必要です。

読者がたまたま昨日のようにそれを探している場合は、デコードとエンコードの主題に関するその他の有用な返信がここにあります

4

2 に答える 2

2

Base64 でエンコードされた文字列に対して 100% 有効な検証はありません。

エンコードされた文字列の=符号は重要ではありません。これは目的であるため、常に存在する必要はありません (エンコードされた文字列の長さは 4 の倍数である必要があります)。文字列の長さが 4 の倍数であるかどうか、Base64 アルファベットの有効な文字をチェックし (「 」を参照) 、入力文字列の末尾にパディング符号文字が 2 つを超えないかどうかのみを確認できます。渡された文字列が有効なBase64でエンコードされた文字列であるかどうかを確認できるコードを次に示します(とにかく、これ以上何もできません):Base64paddingPage 5, Table 1=

function CanBeValidBase64EncodedString(const AValue: string): Boolean;
const
  Base64Alphabet = ['A'..'Z', 'a'..'z', '0'..'9', '+', '/'];
var
  I: Integer;
  ValLen: Integer;
begin
  ValLen := Length(AValue);
  Result := (ValLen > 0) and (ValLen mod 4 = 0);
  if Result then
  begin
    while (AValue[ValLen] = '=') and (ValLen > Length(AValue) - 2) do
      Dec(ValLen);
    for I := ValLen downto 1 do
      if not (AValue[I] in Base64Alphabet) then
      begin
        Result := False;
        Break;
      end;
  end;
end;
于 2012-10-18T07:49:25.340 に答える
1

次のバージョン (2.6.2) では、DecodeStringBase64 に厳密モードを呼び出す追加のブール値パラメーターが含まれます。(これは「ストリーム」バージョンですでに利用可能でした)。

検証エラーがある場合、例外がスローされます。

于 2012-10-18T08:02:29.070 に答える