Skip to content

fix: Refactor isURL() to use Built-in URL Constructor#3061

Merged
lahirumaramba merged 2 commits intomainfrom
lm-fix-url
Feb 4, 2026
Merged

fix: Refactor isURL() to use Built-in URL Constructor#3061
lahirumaramba merged 2 commits intomainfrom
lm-fix-url

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.

@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 refactors the isURL() validator to use the built-in URL constructor, replacing the previous url.parse() and regular expression-based approach. This is a great improvement for security, as it mitigates a potential ReDoS vulnerability. The changes also include stricter validation for hostnames and pathnames to maintain backward compatibility, and new tests have been added to verify the fix and prevent regressions. My main feedback is a suggestion to improve the readability of the hostname validation logic, but overall this is a solid change.

Comment on lines +245 to 252
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)) {
// Check for IPv6 literals which are valid but behave differently.
// Node 'new URL' keeps brackets for IPv6: [::1] -> [::1]
// Check for IPv6 address (simple check for brackets)
if (!/^\[[a-fA-F0-9:.]+\]$/.test(hostname)) {
return false;
}
}

Choose a reason for hiding this comment

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

medium

The nested if condition for hostname validation is a bit difficult to read. You can improve clarity by flattening the logic. Check for a valid domain and a valid IPv6 literal separately and then combine the results. This makes the code's intent—that the hostname must be one of the two—more explicit.

    const isValidDomain = /^[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);
    // An IPv6 literal is enclosed in brackets. `new URL()` has already validated the contents.
    const isIPv6Literal = /^\[[a-fA-F0-9:.]+\]$/.test(hostname);

    if (!isValidDomain && !isIPv6Literal) {
      return false;
    }

Copy link
Collaborator

@jonathanedey jonathanedey left a comment

Choose a reason for hiding this comment

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

LGTM, Thanks!

@lahirumaramba lahirumaramba merged commit 1bf436d into main Feb 4, 2026
12 of 13 checks passed
@lahirumaramba lahirumaramba deleted the lm-fix-url branch February 4, 2026 17:55
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.

2 participants