回りくどい表現になりましたが、現在ウェブサービスをWebbrokerにPostgresをつかって鋭意製作中です。表題の通りヌル文字を弾くのはよいのですがフォームから取得したデータが同じエラーでデータベースに記録されません。
回避策はとっているのですがどれも全く効果がありません。とっかかりはないでしょうか。
手掛かりになればと思いコードを掲載しておきます
// Request.ContentFields の代わりに使用する安全な関数
function GetSafePostValue(Request: TWebRequest; const FieldName: string): string;
var
RawBytes: TBytes;
RawStr: string;
Params, Pair: TArray<string>;
P: string;
begin
Result := '';
// 1. 生のバイトデータを取得(OSの文字コード干渉を完全に防ぐ)
RawBytes := Request.RawContent;
// ※もしISAPIなどで長文が切れる(RawContentが空、またはサイズ不足)場合のフェイルセーフ
if (Length(RawBytes) = 0) and (Request.ContentLength > 0) then
begin
RawStr := Request.ReadString(Request.ContentLength);
end
else
begin
// URLエンコードされたデータはASCIIのみで構成されるため、ASCIIとして文字列化
RawStr := TEncoding.ASCII.GetString(RawBytes);
end;
if RawStr = '' then Exit;
// 2. TStringList のバグを避けるため、String.Split で安全に '&' を分割
Params := RawStr.Split(['&']);
for P in Params do
begin
// 3. '=' で名前と値に分割
Pair := P.Split(['=']);
if (Length(Pair) = 2) and SameText(Pair[0], FieldName) then
begin
try
// 4. 空白の処理と、UTF-8としてのURLデコード
Result := TNetEncoding.URL.Decode(Pair[1].Replace('+', ' '))
.Replace(#0,'',[rfReplaceAll]).Replace(#1,#2,[rfReplaceAll]);
except
// 万が一、ユーザーが不正なパーセントエンコードを送ってきた場合のエラー回避
on E: Exception do
Result := ''; // またはエラーログを出力
end;
Break;
end;
end;
end;
| ツイート |
|