Alternative to dangerouslySetInnerHTML












1















I use React to build a web app that stores documents. Those are created in HTML and are then stored in a database. To show them in the app I load the HTML inside a div by making use of dangerouslySetInnerHTML.



<div dangerouslySetInnerHTML={{__html: this.props.page.content}} />


Even through this works perfectly fine, the name dangerouslySetInnerHTML suggests to pay more attention to this case, but I wonder what exactly can be done to remain flexible enough to load HTML and make it appear in the web app. I believe that the word dangerous addresses the danger of cross-site scripting, meaning that a script could be injected, executing harmful code.



As a countermeasure I thought of cleaning the HTML code before parsing it over to the div. One library addressing this is DOMPurify. Another way would be to convert the HTML code from the database directly into React Elements using html-react-parser.



Would that be the right approach? Or are there alternatives to dangerouslySetInnerHTML?










share|improve this question


















  • 2





    dangerouslySetInnerHTML is called so to make sure that you know what you are doing. There is no safe way to achieve this without some cleaning of the HTML code unless you trust the code in the database.

    – UjinT34
    Nov 23 '18 at 17:00
















1















I use React to build a web app that stores documents. Those are created in HTML and are then stored in a database. To show them in the app I load the HTML inside a div by making use of dangerouslySetInnerHTML.



<div dangerouslySetInnerHTML={{__html: this.props.page.content}} />


Even through this works perfectly fine, the name dangerouslySetInnerHTML suggests to pay more attention to this case, but I wonder what exactly can be done to remain flexible enough to load HTML and make it appear in the web app. I believe that the word dangerous addresses the danger of cross-site scripting, meaning that a script could be injected, executing harmful code.



As a countermeasure I thought of cleaning the HTML code before parsing it over to the div. One library addressing this is DOMPurify. Another way would be to convert the HTML code from the database directly into React Elements using html-react-parser.



Would that be the right approach? Or are there alternatives to dangerouslySetInnerHTML?










share|improve this question


















  • 2





    dangerouslySetInnerHTML is called so to make sure that you know what you are doing. There is no safe way to achieve this without some cleaning of the HTML code unless you trust the code in the database.

    – UjinT34
    Nov 23 '18 at 17:00














1












1








1


1






I use React to build a web app that stores documents. Those are created in HTML and are then stored in a database. To show them in the app I load the HTML inside a div by making use of dangerouslySetInnerHTML.



<div dangerouslySetInnerHTML={{__html: this.props.page.content}} />


Even through this works perfectly fine, the name dangerouslySetInnerHTML suggests to pay more attention to this case, but I wonder what exactly can be done to remain flexible enough to load HTML and make it appear in the web app. I believe that the word dangerous addresses the danger of cross-site scripting, meaning that a script could be injected, executing harmful code.



As a countermeasure I thought of cleaning the HTML code before parsing it over to the div. One library addressing this is DOMPurify. Another way would be to convert the HTML code from the database directly into React Elements using html-react-parser.



Would that be the right approach? Or are there alternatives to dangerouslySetInnerHTML?










share|improve this question














I use React to build a web app that stores documents. Those are created in HTML and are then stored in a database. To show them in the app I load the HTML inside a div by making use of dangerouslySetInnerHTML.



<div dangerouslySetInnerHTML={{__html: this.props.page.content}} />


Even through this works perfectly fine, the name dangerouslySetInnerHTML suggests to pay more attention to this case, but I wonder what exactly can be done to remain flexible enough to load HTML and make it appear in the web app. I believe that the word dangerous addresses the danger of cross-site scripting, meaning that a script could be injected, executing harmful code.



As a countermeasure I thought of cleaning the HTML code before parsing it over to the div. One library addressing this is DOMPurify. Another way would be to convert the HTML code from the database directly into React Elements using html-react-parser.



Would that be the right approach? Or are there alternatives to dangerouslySetInnerHTML?







html reactjs jsx code-injection tsx






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 16:21









SocratesSocrates

1,62472345




1,62472345








  • 2





    dangerouslySetInnerHTML is called so to make sure that you know what you are doing. There is no safe way to achieve this without some cleaning of the HTML code unless you trust the code in the database.

    – UjinT34
    Nov 23 '18 at 17:00














  • 2





    dangerouslySetInnerHTML is called so to make sure that you know what you are doing. There is no safe way to achieve this without some cleaning of the HTML code unless you trust the code in the database.

    – UjinT34
    Nov 23 '18 at 17:00








2




2





dangerouslySetInnerHTML is called so to make sure that you know what you are doing. There is no safe way to achieve this without some cleaning of the HTML code unless you trust the code in the database.

– UjinT34
Nov 23 '18 at 17:00





dangerouslySetInnerHTML is called so to make sure that you know what you are doing. There is no safe way to achieve this without some cleaning of the HTML code unless you trust the code in the database.

– UjinT34
Nov 23 '18 at 17:00












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450028%2falternative-to-dangerouslysetinnerhtml%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53450028%2falternative-to-dangerouslysetinnerhtml%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Feedback on college project

Futebolista

Albești (Vaslui)