Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validate URL to prevent XSS #727

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Conversation

gtsp233
Copy link

@gtsp233 gtsp233 commented Jan 22, 2024

Fix for Cross-Site Scripting (XSS) Vulnerability

I've identified a Cross-Site Scripting (XSS) vulnerability in this package.

Vulnerability Details:

  • Severity: High/Critical
  • Description: There's a risk of malicious script execution when the href of the a tag is controlled by an adversary.

Steps to Reproduce:
In a React.js project:

import { Header } from '@gympass/yoga'

<Header link={`javascript:alert(1)`} />

When a user clicks the link, the malicious code alert(1) will be executed.

Suggested Fix or Mitigation:
It is best practice for a React.js components package to sanitize the href attribute before passing it to an tag. React.js itself, along with many popular libraries such as react-router-dom and Next.js, also ensures the safety of href attributes. For instance, React.js issues warnings about URLs starting with javascript: and is planning to block these in future versions, as indicated in this pull request.

I've already fixed and tested this issue, and have submitted a pull request with the necessary changes. Please review and merge my pull request to resolve this vulnerability. Thanks!

const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
console.warn(`Header has blocked a javascript: URL as a security precaution`);
return null;
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ·· with ····);⏎

Suggested change
return null;
);

@@ -26,7 +26,12 @@ const StyledHeader = styled(Box)`
`}
`;

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Unnecessary escape character: :.

Suggested change
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i

const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
console.warn(`Header has blocked a javascript: URL as a security precaution`);
return null;
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ·· with ····);⏎

Suggested change
return null;
);

@@ -26,7 +26,12 @@ const StyledHeader = styled(Box)`
`}
`;

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Unnecessary escape character: :.

Suggested change
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i

const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
console.warn(`Header has blocked a javascript: URL as a security precaution`);
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ··console.warn(Header·has·blocked·a·javascript:·URL·as·a·security·precaution); with console.warn(⏎······Header·has·blocked·a·javascript:·URL·as·a·security·precaution,

Suggested change
console.warn(`Header has blocked a javascript: URL as a security precaution`);
console.warn(

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ···· with ··

Suggested change
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {

@@ -26,7 +26,12 @@ const StyledHeader = styled(Box)`
`}
`;

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ·/^[\u0000-\u001F·]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i with ⏎····/^[\u0000-\u001F·]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;

Suggested change
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
const isJavaScriptProtocol =

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ···· with ··

Suggested change
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {

const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
console.warn(`Header has blocked a javascript: URL as a security precaution`);
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Unexpected console statement.

Suggested change
console.warn(`Header has blocked a javascript: URL as a security precaution`);

@@ -26,7 +26,12 @@ const StyledHeader = styled(Box)`
`}
`;

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ·link,·logo,·children,·allowJavaScriptUrls·=·True,·...props· with ⏎··link,⏎··logo,⏎··children,⏎··allowJavaScriptUrls·=·True,⏎··...props⏎

Suggested change
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const Header = ({

const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
if (isJavaScriptProtocol.test(link) && !allowJavaScriptUrls) {
console.warn(`Header has blocked a javascript: URL as a security precaution`);
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ··console.warn(Header·has·blocked·a·javascript:·URL·as·a·security·precaution); with console.warn(⏎······Header·has·blocked·a·javascript:·URL·as·a·security·precaution,

Suggested change
console.warn(`Header has blocked a javascript: URL as a security precaution`);
console.warn(

@@ -26,7 +26,12 @@ const StyledHeader = styled(Box)`
`}
`;

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ·link,·logo,·children,·allowJavaScriptUrls·=·True,·...props· with ⏎··link,⏎··logo,⏎··children,⏎··allowJavaScriptUrls·=·True,⏎··...props⏎

Suggested change
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const Header = ({

@@ -26,7 +26,12 @@ const StyledHeader = styled(Box)`
`}
`;

const Header = ({ link, logo, children, ...props }) => {
const Header = ({ link, logo, children, allowJavaScriptUrls = True, ...props }) => {
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
Copy link
Contributor

Choose a reason for hiding this comment

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

Codacy has a fix for the issue: Replace ·/^[\u0000-\u001F·]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i with ⏎····/^[\u0000-\u001F·]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i;

Suggested change
const isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*\:/i
const isJavaScriptProtocol =

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

Successfully merging this pull request may close these issues.

None yet

1 participant