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

feat:created README.md file for best security practices react #69

Merged

Conversation

Siddharth9890
Copy link
Contributor

@Siddharth9890 Siddharth9890 commented Oct 3, 2023

What's this PR do?

Create a Readme file for issue #67
It gives the end user a idea about how to secure they react applications.

@ulises-jeremias @rpmolina

Summary by CodeRabbit

  • Documentation: Introduced a comprehensive guide on React security best practices. The guide covers essential topics such as XSS prevention, URL validation, HTML sanitization, DOM access avoidance, server-side rendering security, dependency vulnerability checks, JSON injection attack prevention, usage of secure React versions, linter configurations, and safe library code usage. This resource aims to enhance the security awareness and practices of developers working with React.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 3, 2023

Walkthrough

This pull request introduces a comprehensive guide on React security best practices. It covers a wide range of topics from XSS prevention, URL validation, HTML sanitization, DOM access avoidance, server-side rendering security, dependency vulnerability checks, JSON injection attack prevention, to the use of non-vulnerable React versions and linter configurations.

Changes

File Summary
examples/react-security-best-practices/README.md A guide on React security best practices, covering various topics such as XSS prevention, URL validation, HTML sanitization, avoiding direct DOM access, securing server-side rendering, checking for known vulnerabilities in dependencies, preventing JSON injection attacks, using secure React versions, linter configurations, and avoiding dangerous library code.

🐇 "In the land of code, where the shadows lie,

We secure our apps, under the cloud's sky.

From XSS to JSON, threats big and small,

With this guide in hand, we'll conquer them all!" 🎉


Tips

Chat with CodeRabbit Bot (@coderabbitai)

  • Mention @coderabbitai in any review comment for bot assistance.
  • Note: Review comments are made on code diffs or files, not on the PR overview.

Pause Incremental Reviews

  • Insert @coderabbitai: ignore in the PR description to halt the bot's ongoing reviews. Remove the line to resume.
  • Additionally, enter @coderabbitai pause to halt the bot's ongoing reviews as any issue or review comment. To
    resume reviews, enter @coderabbitai resume as any issue or review comment.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 8

Commits Files that changed from the base of the PR and between fe90f4d and 9c6828b.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Additional comments (Suppressed): 2
examples/react-security-best-practices/README.md (2)
  • 91-91: The code snippet provided here is a duplicate of the one provided at lines 74-76. Consider removing this duplicate to avoid redundancy.

  • 131-131: The link provided for the ESLint React security config seems to be broken or non-existent. Please verify and provide the correct link.


### How to prevent XSS attacks?

Use default data binding with curly braces `` {} `` and React will automatically escape values to protect against XSS attacks. Note that this protection only occurs when rendering textContent and not when rendering HTML attributes.
Copy link
Contributor

Choose a reason for hiding this comment

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

The statement "React will automatically escape values to protect against XSS attacks" is partially correct. While React does escape values when rendering text content, it doesn't do so for HTML attributes or JSX properties. This could lead to potential security vulnerabilities if not handled correctly. Consider clarifying this point in your guide.

Comment on lines 33 to 45
```

function validateURL(url) {

const parsed = new URL(url)

return ['https:', 'http:'].includes(parsed.protocol)

}

<a href={validateURL(url) ? url : ''}>Click here!</a>

```
Copy link
Contributor

Choose a reason for hiding this comment

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

This code snippet has a potential issue. The validateURL function returns a boolean value indicating whether the URL's protocol is either 'http:' or 'https:'. However, in the anchor tag, you're using this boolean value directly as the href attribute if the URL is valid. This would result in the href being set to 'true' or 'false', which is not the intended behavior. Instead, you should use the original URL if it's valid, and fallback to an empty string or some default URL if it's not.

- <a href={validateURL(url) ? url : ''}>Click here!</a>
+ <a href={validateURL(url) ? url : '#'}>Click here!</a>

Comment on lines 58 to 59
One of the was to do XSS attacks is by possbily inserting HTML directly into rendered DOM nodes using dangerouslySetInnerHTML. Any content inserted this way must be sanitized beforehand. Use a sanitization library like **dompurify** on any values before placing them into the dangerouslySetInnerHTML prop.

Copy link
Contributor

Choose a reason for hiding this comment

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

The phrase "One of the was to do XSS attacks" seems to have a typo. It should probably be "One of the ways to do XSS attacks". Please correct this to improve readability.

Comment on lines 80 to 81
## Avoid Direct DOM Access
Always avoid accessing the DOM to inject content into DOM nodes directly. But if you do have to, use `dangerouslySetInnerHTML` to inject HTML and sanitize it before injecting it using **dompurify**.
Copy link
Contributor

Choose a reason for hiding this comment

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

The statement "Always avoid accessing the DOM to inject content into DOM nodes directly" might be misleading. Direct DOM manipulation is sometimes necessary, especially when integrating with third-party libraries or for performance optimization. However, it's true that in most cases, especially when dealing with user-generated content, it's safer to let React handle the DOM updates. Consider rephrasing this sentence to make it more accurate.

Comment on lines 101 to 107

Some versions of third-party components might contain JavaScript security issues. Always check your dependencies with a software composition analysis (SCA) tool before adding them to a project, and be sure to update when a newer version becomes available. The following ones are recommended to check for vulnerabilities

- [Synk](https://app.snyk.io/login)
- [Github dependabot](https://github.com/dependabot)
- [Sonar Qube](https://www.sonarsource.com/products/sonarqube/)

Copy link
Contributor

Choose a reason for hiding this comment

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

It's great that you're recommending tools for checking known vulnerabilities in dependencies. However, the link provided for Synk seems to be incorrect. It should be Snyk, not Synk. Please correct this.

- - [Synk](https://app.snyk.io/login)
+ - [Snyk](https://snyk.io/)


For example:

`` window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace( /</g, '\\u003c')} ``
Copy link
Contributor

Choose a reason for hiding this comment

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

The code snippet provided here is a good example of how to prevent JSON injection attacks. However, it would be helpful to provide some context or explanation about why replacing < characters with \u003c can help prevent these types of attacks.


The React library has had a few [high severity vulnerabilities](https://snyk.io/vuln/npm:react/) in the past, so it is a good idea to stay up to date with the latest version.

Avoid vulnerable versions of the `react` and `react-dom` by verifying that you are on the latest version using npm outdated to see the latest versions.
Copy link
Contributor

Choose a reason for hiding this comment

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

The command npm outdated is mentioned here but it might be useful to show an example of how to use it to check for outdated packages. This could help readers who are not familiar with this command.




Avoid libraries that do use `dangerouslySetInnerHTML`, `innerHTML`, unvalidated URLs or other unsafe patterns. Use security linters on your `node_modules` folder to detect unsafe patterns in your library code.
Copy link
Contributor

Choose a reason for hiding this comment

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

The statement "Avoid libraries that do use dangerouslySetInnerHTML, innerHTML, unvalidated URLs or other unsafe patterns" might be too broad. While it's true that these features can lead to security vulnerabilities if misused, they are sometimes necessary and can be used safely with proper precautions. Consider rephrasing this sentence to make it more accurate.

Copy link
Member

@ulises-jeremias ulises-jeremias left a comment

Choose a reason for hiding this comment

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

@Siddharth9890 this is a great contribution! I'll wait until you apply the suggestions made by @coderabbutai and then I'll take another look 😊

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 7

Commits Files that changed from the base of the PR and between 9c6828b and 1ef2c86.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Additional comments (Suppressed): 3
examples/react-security-best-practices/README.md (3)
  • 176-190: The advice to check for known vulnerabilities in dependencies is crucial. The tools recommended are appropriate and widely used in the industry.

  • 211-223: The advice to use non-vulnerable versions of React is important. The npm outdated command is a useful tool for checking outdated packages.

  • 225-237: The recommendation to use linter configurations and plugins to automatically detect security issues is excellent. It's also great to see the suggestion to use a pre-commit hook to fail when security-related linter issues are detected.

Comment on lines 12 to 32
## Use Default XSS Protection with Data Binding 🚀



### Firstly what is XSS?



XSS, or Cross-Site Scripting, is a type of security vulnerability that can occur in any web applications. XSS happens when an application allows untrusted data to be included in web pages that are then viewed by other users. This can lead to malicious code execution in the context of a user's browser, potentially compromising the security and privacy of that user.



So basically it happens when we render user generated data directly in DOM without proper sanitization.



### How to prevent XSS attacks?



Use default data binding with curly braces `` {} `` and React will automatically escape values to protect against XSS attacks. Note that this protection only occurs when rendering textContent and not when rendering HTML attributes.
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on XSS protection is well explained. However, it would be beneficial to mention that while React's default data binding provides some level of protection against XSS attacks, it does not cover all cases. For instance, it doesn't protect against XSS when using dangerouslySetInnerHTML or when attributes are being set dynamically. This could lead developers into a false sense of security.

Comment on lines 46 to 70
## Watch Out for Dangerous URLs and URL-Based Script Injection



URLs can contain dynamic script content via javascript: protocol URLs. Use validation to assure your links are http: or https: to avoid javascript: URL-based script injection. Achieve URL validation using a native URL parsing function then match the parsed protocol property to an allow list.



For example:-



```



function validateURL(url) {



const parsed = new URL(url)



return ['https:', 'http:'].includes(parsed.protocol)
Copy link
Contributor

Choose a reason for hiding this comment

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

This section correctly highlights the dangers of URL-based script injection and provides a good example of how to validate URLs. However, it might be worth mentioning that this validation should be done server-side as well, as client-side JavaScript can be tampered with by an attacker.

Comment on lines 98 to 132
## Sanitize and Render HTML



One of the ways to do XSS attacks is by possbily inserting HTML directly into rendered DOM nodes using dangerouslySetInnerHTML. Any content inserted this way must be sanitized beforehand. Use a sanitization library like **dompurify** on any values before placing them into the dangerouslySetInnerHTML prop.





Use **dompurify** when inserting HTML into the DOM.





For example:-



```



import purify from "dompurify";





<div dangerouslySetInnerHTML={{ __html:purify.sanitize(data) }} />



```
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on sanitizing and rendering HTML is clear and concise. It correctly advises the use of a sanitization library like dompurify when using dangerouslySetInnerHTML. However, it would be helpful to also mention that even with sanitization, dangerouslySetInnerHTML should be used sparingly and only when absolutely necessary, as it increases the risk of XSS attacks.

Comment on lines 138 to 142
## Avoid Direct DOM Access

Always avoid accessing the DOM to inject content into DOM nodes directly. But if you do have to, use `dangerouslySetInnerHTML` to inject HTML and sanitize it before injecting it using **dompurify**.


Copy link
Contributor

Choose a reason for hiding this comment

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

This section correctly advises against direct DOM access. However, it might be useful to explain why direct DOM access is discouraged in React (e.g., it breaks the unidirectional data flow model of React, can lead to unexpected behavior, etc.).

Comment on lines 162 to 172
## Secure React server-side rendering

Data binding will provide automatic content escaping when using server-side rendering functions like `ReactDOMServer.renderToString()` and `ReactDOMServer.renderToStaticMarkup()`.



Avoid concatenating strings onto the output of `renderToStaticMarkup()` before sending the strings to the client for hydration.



To avoid XSS, don’t concatenate unsanitized data with the output of `renderToStaticMarkup()`
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on securing server-side rendering is accurate and important. It might be worth expanding on why concatenating unsanitized data with the output of renderToStaticMarkup() can lead to XSS attacks.

Comment on lines 192 to 208
## Avoid JSON Injection Attacks



It is common to send JSON data along with server-side rendered React pages. Always escape `<` characters with a benign value to avoid injection attacks.



Always escape HTML significant values from JSON with benign equivalent characters.



For example:

`` window.__PRELOADED_STATE__ = ${JSON.stringify(preloadedState).replace( /</g, '\\u003c')} ``

Here replacing the `<` character with `\u003c` is a security measure to ensure that potentially malicious data included in JSON does not have unintended consequences when rendered in HTML context. It's a part of a broader strategy to protect against JSON injection and XSS attacks by properly escaping and validating data.
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on avoiding JSON Injection Attacks is well written and provides a good example of how to escape potentially harmful characters in JSON data. However, it might be worth mentioning that this is just one part of a broader strategy to protect against JSON injection and XSS attacks by properly escaping and validating data.

Comment on lines 243 to 253
## Avoid dangerous library code



Library code is often used to perform dangerous operations like directly inserting HTML into the DOM. Review library code manually or with linters to detect unsafe usage of React’s security mechanisms.





Consider the use of libraries with a caution that do use `dangerouslySetInnerHTML`, `innerHTML`, unvalidated URLs or other unsafe patterns. Use security linters on your `node_modules` folder to detect unsafe patterns in your library code.
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on avoiding dangerous library code correctly highlights the risks associated with using libraries that perform unsafe operations. However, it would be beneficial to provide some examples of what these "unsafe patterns" might look like.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 8

Commits Files that changed from the base of the PR and between 1ef2c86 and aa646d0.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Additional comments (Suppressed): 2
examples/react-security-best-practices/README.md (2)
  • 204-220: This section does a great job explaining why direct DOM access is discouraged in React. It covers all the main points including breaking unidirectional data flow, inefficiency, security concerns, and maintenance challenges. The explanations are clear and concise.

  • 306-332: This section does a good job explaining JSON injection attacks and how to prevent them by escaping certain characters in JSON data. The provided example clearly demonstrates how to implement this security measure.

Comment on lines 20 to 50
## Use Default XSS Protection with Data Binding 🚀





### Firstly what is XSS?





XSS, or Cross-Site Scripting, is a type of security vulnerability that can occur in any web applications. XSS happens when an application allows untrusted data to be included in web pages that are then viewed by other users. This can lead to malicious code execution in the context of a user's browser, potentially compromising the security and privacy of that user.





So basically it happens when we render user generated data directly in DOM without proper sanitization.





### How to prevent XSS attacks?





Use default data binding with curly braces `` {} `` and React will automatically escape values to protect against XSS attacks. Note that this protection only occurs when rendering textContent and not when rendering HTML attributes.
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on XSS protection is well written and provides a good explanation of what XSS is and how to prevent it in React. However, it would be beneficial to include an example of how XSS might occur when rendering HTML attributes, as mentioned in line 50. This would provide a clearer understanding for readers who are not familiar with this concept.

Comment on lines 78 to 120
## Watch Out for Dangerous URLs and URL-Based Script Injection





URLs can contain dynamic script content via javascript: protocol URLs. Use validation to assure your links are http: or https: to avoid javascript: URL-based script injection. Achieve URL validation using a native URL parsing function then match the parsed protocol property to an allow list.





For example:-





```





function validateURL(url) {





const parsed = new URL(url)





return ['https:', 'http:'].includes(parsed.protocol)





}
Copy link
Contributor

Choose a reason for hiding this comment

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

This section does a good job explaining the dangers of URL-based script injection and how to prevent it. However, there's a potential issue in the validateURL function. If the URL is invalid or malformed, the new URL(url) constructor will throw an error which isn't currently being handled. Consider adding error handling to this function.

function validateURL(url) {
+   try {
        const parsed = new URL(url)
        return ['https:', 'http:'].includes(parsed.protocol)
+   } catch (error) {
+       console.error(`Invalid URL: ${url}`)
+       return false
+   }
}

Comment on lines 152 to 198
## Sanitize and Render HTML





One of the ways to do XSS attacks is by possbily inserting HTML directly into rendered DOM nodes using dangerouslySetInnerHTML. Any content inserted this way must be sanitized beforehand. Use a sanitization library like **dompurify** on any values before placing them into the dangerouslySetInnerHTML prop.







Use **dompurify** when inserting HTML into the DOM.



For example:-





```





import purify from "dompurify";







<div dangerouslySetInnerHTML={{ __html:purify.sanitize(data) }} />





```


Copy link
Contributor

Choose a reason for hiding this comment

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

The section about sanitizing and rendering HTML correctly identifies the risks associated with using dangerouslySetInnerHTML and recommends using a library like dompurify to sanitize data. However, it would be helpful to mention that even sanitized data can still pose risks if not used carefully, and that dangerouslySetInnerHTML should be avoided whenever possible.

Comment on lines 252 to 276
## Secure React server-side rendering



Data binding will provide automatic content escaping when using server-side rendering functions like `ReactDOMServer.renderToString()` and `ReactDOMServer.renderToStaticMarkup()`.





Avoid concatenating strings onto the output of `renderToStaticMarkup()` before sending the strings to the client for hydration.





To avoid XSS, don’t concatenate unsanitized data with the output of `renderToStaticMarkup()`

**Why Concatenating Unsanitized Data with `renderToStaticMarkup()` Output is Risky for XSS Attacks:**
1. **Injection of Malicious Code**: If you concatenate unsanitized or untrusted data directly into the HTML generated by `renderToStaticMarkup()`, you open up the possibility of injecting malicious code, such as JavaScript, into your rendered HTML. Attackers can craft payloads that include script tags or other HTML elements, and if these payloads are included in your page, they can execute arbitrary code in the context of your web application.

2. **XSS Attack Surface**: By not properly sanitizing or escaping user-generated data, you create an XSS attack surface. Attackers can exploit this surface to inject scripts that steal user data, perform actions on behalf of users, or otherwise compromise the security and integrity of your application.

3. **Browser Security Context**: When a browser encounters unsanitized data in your HTML, it interprets it as code to execute, not as plain text. This behavior is what makes XSS attacks possible. Properly escaping or sanitizing data ensures that it is treated as data and not executable code.

Copy link
Contributor

Choose a reason for hiding this comment

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

The section on securing server-side rendering provides important information about avoiding XSS attacks by not concatenating unsanitized data with the output of renderToStaticMarkup(). However, it would be beneficial to include an example demonstrating the correct and incorrect way to use renderToStaticMarkup().

Comment on lines 279 to 305
## Check for Known Vulnerabilities in Dependencies





Some versions of third-party components might contain JavaScript security issues. Always check your dependencies with a software composition analysis (SCA) tool before adding them to a project, and be sure to update when a newer version becomes available. The following ones are recommended to check for vulnerabilities





- [Snyk](https://snyk.io/)



- [Github dependabot](https://github.com/dependabot)



- [Sonar Qube](https://www.sonarsource.com/products/sonarqube/)





## Avoid JSON Injection Attacks
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on checking for known vulnerabilities in dependencies is well written. It provides useful tools for checking dependencies and explains why this is important. However, it might be helpful to provide a brief example or step-by-step guide on how to use one of these tools.

Comment on lines 335 to 354
## Use non-vulnerable versions of React





The React library has had a few [high severity vulnerabilities](https://snyk.io/vuln/npm:react/) in the past, so it is a good idea to stay up to date with the latest version.





Avoid vulnerable versions of the `react` and `react-dom` by verifying that you are on the latest version using `npm outdated` to see the latest versions.See how to use this command below

Navigate to your code directory first and then run

`npm outdated`

It will show all the outdated packages in a tabular format.

Copy link
Contributor

Choose a reason for hiding this comment

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

The section on using non-vulnerable versions of React is informative and provides a practical command (npm outdated) to check for outdated packages. However, it would be helpful to also mention that developers should regularly update all their dependencies, not just React, to ensure they are using secure versions.

Comment on lines 357 to 383
## Use linter configurations





Install linter configurations and plugins that will automatically detect security issues in your code and offer remediation advice.





Use the [ESLint React security config](https://github.com/snyk-labs/eslint-config-react-security/) to detect security issues in our code base.





Configure a pre-commit hook that fails when security-related linter issues are detected using a library like [husky](https://github.com/typicode/husky).







## Avoid dangerous library code
Copy link
Contributor

Choose a reason for hiding this comment

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

The section on using linter configurations is well written and provides useful resources for setting up linters to detect security issues. However, it would be beneficial to provide a brief example or step-by-step guide on how to set up a pre-commit hook with husky.

Comment on lines 384 to 403





Library code is often used to perform dangerous operations like directly inserting HTML into the DOM. Review library code manually or with linters to detect unsafe usage of React’s security mechanisms.







Consider the use of libraries with a caution that do use `dangerouslySetInnerHTML`, `innerHTML`, unvalidated URLs or other unsafe patterns. Use security linters on your `node_modules` folder to detect unsafe patterns in your library code.






Copy link
Contributor

Choose a reason for hiding this comment

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

The section on avoiding dangerous library code correctly identifies potential risks associated with certain libraries and recommends reviewing library code manually or with linters. However, it would be helpful to provide examples of what unsafe patterns to look for when reviewing library code.

@Siddharth9890
Copy link
Contributor Author

@ulises-jeremias hey man are you sure about this code rabbit ai because the thing is it is suggesting the changes but firstly the readme is getting too big for the end user to read and secondly now it is suggesting things which should not be there like how to update outdated packages. I believe this should provide a short summary not a 10 page long file to read

@ulises-jeremias
Copy link
Member

ulises-jeremias commented Oct 3, 2023

@ulises-jeremias hey man are you sure about this code rabbit ai because the thing is it is suggesting the changes but firstly the readme is getting too big for the end user to read and secondly now it is suggesting things which should not be there like how to update outdated packages. I believe this should provide a short summary not a 10 page long file to read

Yeah, you are right. You can ignore those suggestions 👌

I'll run the CI now and then I'll do another review

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 1

Commits Files that changed from the base of the PR and between aa646d0 and e92b347.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Additional comments (Suppressed): 11
examples/react-security-best-practices/README.md (11)
  • 17-21: The explanation of how to prevent XSS attacks is clear and concise. The use of default data binding with curly braces {} in React for automatic escaping of values is a good practice.

  • 27-29: This section correctly highlights the limitations of React's default XSS protection, specifically mentioning dangerouslySetInnerHTML and dynamic attribute values as potential sources of vulnerabilities. It's important to note that developers are responsible for ensuring the safety of these features.

  • 65-69: The use of dompurify to sanitize data before using dangerouslySetInnerHTML is a good practice to prevent XSS attacks. However, it's important to remember that this should only be used when absolutely necessary, as mentioned in line 70.

  • 78-85: The explanation of why direct DOM access is discouraged in React is comprehensive and accurate. It covers the main reasons including breaking unidirectional data flow, inefficiency, security concerns, and maintenance challenges.

  • 91-95: This code snippet repeats the same example given in lines 65-69. It would be better to provide a different example or remove this duplicate to avoid confusion.

- import  purify  from  "dompurify";
- 
- <div  dangerouslySetInnerHTML={{__html:purify.sanitize(data) }} />
  • 106-110: The risks associated with concatenating unsanitized data with renderToStaticMarkup() output are well explained. This section correctly highlights the potential for injection of malicious code, XSS attack surface, and browser security context issues.

  • 114-120: The recommendation to use software composition analysis (SCA) tools like Snyk, Github dependabot, and Sonar Qube to check for known vulnerabilities in dependencies is a good practice for maintaining secure applications.

  • 130-132: The advice to escape < characters in JSON data to prevent injection attacks is a good security measure. The provided example clearly demonstrates how to implement this.

  • 136-144: The suggestion to use non-vulnerable versions of React and to check for outdated packages using npm outdated is a good practice for maintaining secure applications.

  • 148-152: The recommendation to use linter configurations and pre-commit hooks to automatically detect and fix security issues is a good practice for maintaining secure applications.

  • 156-158: The caution against dangerous library code and the suggestion to use security linters on the node_modules folder are good practices for maintaining secure applications.

Comment on lines +38 to +48
function validateURL(url) {

const parsed = new URL(url)

return ['https:', 'http:'].includes(parsed.protocol)

}

<a href={validateURL(url) ? url : '#'}>Click here!</a>

```
Copy link
Contributor

@coderabbitai coderabbitai bot Oct 3, 2023

Choose a reason for hiding this comment

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

The function validateURL(url) is a good example of how to validate URLs to prevent script injection. However, it would be better to throw an error or return a default safe URL when the input URL is invalid, rather than just returning a boolean. This way, the function can be used directly in the href attribute without additional checks.

- function validateURL(url) {
-     const parsed = new URL(url)
-     return ['https:', 'http:'].includes(parsed.protocol)
- }
- <a href={validateURL(url) ? url : '#'}>Click here!</a>
+ function validateURL(url) {
+     try {
+         const parsed = new URL(url)
+         if (['https:', 'http:'].includes(parsed.protocol)) {
+             return url;
+         } else {
+             throw new Error('Invalid URL protocol');
+         }
+     } catch (error) {
+         console.error(error);
+         return '#'; // Default safe URL
+     }
+ }
+ <a href={validateURL(url)}>Click here!</a>

Copy link
Contributor

Choose a reason for hiding this comment

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

@ulises-jeremias Understood, I will disregard the previous comment. If you have any other requests or need further assistance, feel free to ask.

@ulises-jeremias
Copy link
Member

@Siddharth9890 I'll pause coderabbit right now. You can focus on just fixing the issues from markdownlint and then I'll approve the PR and merge it 😊

feel free to reach out if you have any question

@coderabbitai pause

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 0

Commits Files that changed from the base of the PR and between e92b347 and b475977.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Files skipped from review due to trivial changes (1)
  • examples/react-security-best-practices/README.md

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 0

Commits Files that changed from the base of the PR and between b475977 and 4d53033.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Files skipped from review due to trivial changes (1)
  • examples/react-security-best-practices/README.md

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Review Status

Actionable comments generated: 0

Commits Files that changed from the base of the PR and between 4d53033 and 2db295d.
Files selected for processing (1)
  • examples/react-security-best-practices/README.md (1 hunks)
Files skipped from review due to trivial changes (1)
  • examples/react-security-best-practices/README.md

Copy link
Member

@ulises-jeremias ulises-jeremias left a comment

Choose a reason for hiding this comment

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

@Siddharth9890 all checks passed! thank you very much for your contribution! you have done a great work on this! 🔥

@ulises-jeremias ulises-jeremias merged commit a689d0e into nanlabs:main Oct 4, 2023
@ulises-jeremias ulises-jeremias linked an issue Oct 4, 2023 that may be closed by this pull request
2 tasks
alecastro-nan pushed a commit to alecastro-nan/frontend-reference that referenced this pull request Dec 5, 2023
…s#69)

* feat:created README.md file for best security practices react

* chore:improve suggestions suggested by coderabbit

* chore:improve suggestions suggested by coderabbit nanlabs#2

* chore:removed extra spaces

* chore: removed leading and trailing spaces

* chore:linting changes for code

* chore:hopefully final fixes for linting
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.

Guide on 10 Best Practices for Security in React Applications
2 participants