Skip to content

Commit 795d855

Browse files
committed
fix: make CodeQL accept media URL validation
1 parent 9fb2032 commit 795d855

2 files changed

Lines changed: 35 additions & 4 deletions

File tree

src/app/components/AuthenticatedImg.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,24 @@ type AuthenticatedImgProps = React.ImgHTMLAttributes<HTMLImageElement> & {
88

99
export function AuthenticatedImg({ src, ...props }: AuthenticatedImgProps) {
1010
const resolvedSrc = useMediaSrc(src);
11-
const safeSrc = getSafeMediaUrl(resolvedSrc ?? src);
11+
const candidateSrc = resolvedSrc ?? src;
12+
const safeSrc = getSafeMediaUrl(candidateSrc);
1213

1314
if (!safeSrc) return null;
1415

15-
return <img {...props} src={safeSrc} />;
16+
try {
17+
const parsedSrc = new URL(safeSrc);
18+
19+
if (
20+
parsedSrc.protocol !== 'blob:' &&
21+
parsedSrc.protocol !== 'http:' &&
22+
parsedSrc.protocol !== 'https:'
23+
) {
24+
return null;
25+
}
26+
27+
return <img {...props} src={parsedSrc.toString()} />;
28+
} catch {
29+
return null;
30+
}
1631
}

src/app/plugins/react-custom-html-parser.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,10 +489,26 @@ function FallbackImg({
489489
}: ComponentPropsWithoutRef<'img'> & { fallback: ReactNode }) {
490490
const [failed, setFailed] = useState(false);
491491
const resolvedSrc = useMediaSrc(src);
492-
const safeSrc = getSafeMediaUrl(resolvedSrc ?? src);
492+
const candidateSrc = resolvedSrc ?? src;
493+
const safeSrc = getSafeMediaUrl(candidateSrc);
493494
if (failed) return <>{fallback}</>;
494495
if (!safeSrc) return <>{fallback}</>;
495-
return <img {...props} src={safeSrc} onError={() => setFailed(true)} />;
496+
497+
try {
498+
const parsedSrc = new URL(safeSrc);
499+
500+
if (
501+
parsedSrc.protocol !== 'blob:' &&
502+
parsedSrc.protocol !== 'http:' &&
503+
parsedSrc.protocol !== 'https:'
504+
) {
505+
return <>{fallback}</>;
506+
}
507+
508+
return <img {...props} src={parsedSrc.toString()} onError={() => setFailed(true)} />;
509+
} catch {
510+
return <>{fallback}</>;
511+
}
496512
}
497513

498514
export const getReactCustomHtmlParser = (

0 commit comments

Comments
 (0)