Skip to content

Conversation

@lahirumaramba
Copy link
Member

@lahirumaramba lahirumaramba commented Feb 3, 2026

Replace the RegEx-based validation in isURL() (which was prone to ReDoS) with the standard built-in URL constructor. This improves security, code simplicity, and correctness by leveraging the platform's native URL parsing.

@lahirumaramba lahirumaramba added release-note release:stage Stage a release candidate labels Feb 3, 2026
@gemini-code-assist
Copy link

Summary of Changes

Hello @lahirumaramba, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request implements a crucial security enhancement by addressing a potential ReDoS vulnerability in the isURL validator. The core change involves refining the regular expression responsible for hostname validation, making it more resilient against malicious inputs that could lead to excessive processing time. Complementary to this fix, a comprehensive suite of new tests has been introduced to rigorously verify the updated validator's behavior under various conditions, including long and complex URLs, ensuring both security and performance.

Highlights

  • ReDoS Vulnerability Fix: The regular expression used for hostname validation within the isURL utility function has been updated to prevent a potential Regular Expression Denial of Service (ReDoS) vulnerability. The change removes an optional group that could lead to excessive backtracking.
  • Enhanced URL Validation Tests: New test cases have been added to the isURL function's test suite. These tests specifically target ReDoS scenarios, ensuring the validator handles long valid and invalid URLs efficiently, and verifies the strict validation of dot usage in hostnames.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • src/utils/validator.ts
    • Updated the hostname validation regular expression within the isURL function to prevent a potential ReDoS vulnerability by modifying the ([.]?[a-zA-Z0-9]+[\w-]*)*$ part to (\.[a-zA-Z0-9]+[\w-]*)*$.
  • test/unit/utils/validator.spec.ts
    • Added a new test suite for isURL focusing on ReDoS and long input scenarios.
    • Introduced tests to ensure quick handling of long valid URLs and long invalid URLs (ReDoS check) within a specified timeout.
    • Included a test to verify the correct rejection of invalid dot patterns in hostnames, such as 'a..b'.
Activity
  • The pull request was created by lahirumaramba.
  • No human activity (comments, reviews, approvals) has been recorded yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request correctly addresses a potential Regular Expression Denial of Service (ReDoS) vulnerability in the URL validator. The fix involves making the hostname validation regex stricter by removing an optional character within a repeated group, which prevents catastrophic backtracking. The accompanying tests are well-designed, verifying the fix and ensuring there are no performance regressions with long or invalid URLs. I have one suggestion to further simplify the regex for improved readability and performance.

@lahirumaramba lahirumaramba changed the title fix: Potential ReDos vulnerability in url validator fix: Refactor isURL() to use Built-in URL Constructor Feb 3, 2026
@lahirumaramba
Copy link
Member Author

/gemini review

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request successfully refactors the isURL() function to utilize the built-in URL constructor, which is a significant improvement for security by mitigating ReDoS vulnerabilities and enhancing code simplicity. The addition of new tests for long URLs and ReDoS checks is also highly commendable. However, there are a couple of points regarding validation behavior that need clarification or adjustment to ensure consistency and maintain the desired level of strictness.

}
}
// Allow any query string and hash as long as no invalid character is used.
return true;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The original isURL function included a specific regex (pathnameRe) to validate the pathname component, ensuring it only contained a defined set of safe characters. This new implementation removes that validation, relying solely on the URL constructor. The URL constructor is very permissive with pathnames (e.g., it will encode spaces), which might allow URLs that were previously considered invalid by this utility. This is a significant change in validation behavior and could potentially lead to unexpected behavior or security vulnerabilities if the stricter pathname validation was a requirement. Please consider re-introducing a similar level of pathname validation if the original strictness is still desired.

// Must be alphanumeric with optional dashes/underscores, separated by dots.
// Cannot start/end with dot or dash (mostly).
// This regex is safe (no nested quantifiers with overlap).
if (!/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$/.test(hostname)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The new hostname regex ^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?)*$ explicitly disallows underscores (_) in hostnames. While this aligns better with RFC standards for hostnames and makes an existing test pass, the PR description states the goal is to "match previous behavior". The old regex technically allowed _ via \w. It would be clearer to acknowledge this as an intentional improvement for RFC compliance rather than matching previous behavior, or to clarify if the previous url.parse implicitly rejected underscores despite the regex.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release:stage Stage a release candidate release-note

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant