2023. 12. 29. 09:44ใ๐ Web
์๋ฐ/์คํ๋ง๋ถํธ ํ๊ฒฝ์์ html ํ ํ๋ฆฟ์ ๋ค๋ฃจ๋ ์ค ๋ด๋ถ ๋ฌธ์์ด์์ ํน์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ฌธ์ ๊ฐ ๋ ํน์๋ฌธ์๋ &(ampersand) ์๋ค. ํด๋น ๊ธฐํธ๊ฐ ํฌํจ๋ ๋ฌธ์์ด์ ํ์ฑํ์ง ๋ชปํ๊ณ html ์ ์ด์ค์ผ์ดํ ๋ฌธ์
๋ก ๋ณ๋ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋จ ๊ฑธ ์๊ฒ ๋๋ค.
์ด์ค์ผ์ดํ ๋ฌธ์๋ HTML ๋ฌธ์์์ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๋ฌธ์๋ฅผ ํํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํน์ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค. ์ด์ค์ผ์ดํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ๋ฌธ์๊ฐ HTML ํ๊ทธ๋ ์ํฐํฐ๋ก ์ธ์๋์ง ์๊ณ ํ ์คํธ ๊ทธ ์์ฒด๋ก ํํํ ์ ์๋ค.
๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ HTML ์ด์ค์ผ์ดํ ๋ฌธ์๋ ๋ค์๊ณผ ๊ฐ๋ค:
- < : < ๊ธฐํธ๋ฅผ ํ ์คํธ๋ก ํํํ ๋ ์ฌ์ฉ
- > : > ๊ธฐํธ๋ฅผ ํ ์คํธ๋ก ํํํ ๋ ์ฌ์ฉ
- & : & ๊ธฐํธ๋ฅผ ํ ์คํธ๋ก ํํํ ๋ ์ฌ์ฉ
- " : " ๊ธฐํธ๋ฅผ ํ ์คํธ๋ก ํํํ ๋ ์ฌ์ฉ
- ' : ' ๊ธฐํธ๋ฅผ ํ ์คํธ๋ก ํํํ ๋ ์ฌ์ฉ
์๋ ํ๋ ๋ณ๋๋ก ์ฒ๋ฆฌ๊ฐ ํ์ํ Escape ๋ฌธ์์ ์์๋ค.
๋ฌธ์ | ๋์ฒด ๋ฌธ์ |
! | |
' | ' |
" | " |
& | & |
< | < |
> | > |
Java code
ํด๋น ๋ฉ์๋๋ ์ด์ค์ผ์ดํ ๋ฌธ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ String ์ ์ธ์๋ก ๋ฐ๋๋ค.
์์๋ก ๋ช๊ฐ์ง์ ์ด์ค์ผ์ดํ ๋ฌธ์(&, <, >, \) ๋ง ํ๋์ฝ๋ฉํ์ฌ replace ํ๋ค.
public String htmlEscape(String parameters) {
return parameters.replaceAll("&", "&")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("\"", """);
}
๊ฐ์ ๋ Code (Feat. chat GPT)
sonarlint ์์ replaceAll ์ ๋งค๋ฒ ์๋ก์ด String ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด์ด ๊ธธ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ด์ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค๊ณ ๊ฒฝ๊ณ ๋ฅผ ์คฌ๋ค.
์กฐ์ธ์ ๋ฐ๋ผ String ์ replaceAll ๋์ StringBuilder ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ค.
while ๋ฌธ ๋ด๋ถ์์๋ ์นํํด์ผ ํ ๋ฌธ์์ ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ์ฐพ์ Escape ๋ฌธ์๋ก replace ํ๋ค.
์ด๋ ๊ฒ ๋๋ฉด StringBuilder์ replace ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋งค๋ฒ ์๋ก์ด String ์ ์์ฑํ์ง ์ ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ๋ฐฉ์งํ ์ ์๋ค.
private String htmlEscape(String parameters) {
Map<String, String> map = new HashMap<>();
map.put("&", "&");
map.put("<", "<");
map.put(">", ">");
map.put("\"", """);
StringBuilder result = new StringBuilder(parameters);
for (Map.Entry<String, String> entry : map.entrySet()) {
int start = result.indexOf(entry.getKey());
while (start != -1) {
result.replace(start, start + entry.getKey().length(), entry.getValue());
start = result.indexOf(entry.getKey(), start + entry.getValue().length());
}
}
return result.toString();
}
๊ฐ์ ํ ์
์ ์ฝ๋์์๋ ๋ช ๊ฐ์ง์ ํน์ ๋ฌธ์๋ง ํ๋์ฝ๋ฉํ์ฌ ์ด์ค์ผ์ดํ ๋ฌธ์๋ก ์นํํ๋ค.
๋ง์ฝ ํ๋์ฝ๋ฉ๋ ๋ฌธ์ ์ด์ธ์ ํน์ ๋ฌธ์๊ฐ ๋ค์ด์ค๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๋น์ฐํ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
ํ๋์ฝ๋ฉ ๋ฐฉ์์ด ์๋ ๋ ๋ง์ ์ผ์ด์ค์ ํน์ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค.
'๐ Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Refresh Token Rotation ๊ณผ Redis๋ก ํ ํฐ ํ์ทจ ์๋๋ฆฌ์ค ๋์ (9) | 2023.04.21 |
---|---|
Web Server ์ WAS ๋ฅผ ์์๋ณด์ (1) | 2022.12.24 |
REST API ๋์์ธ 15๊ฐ์ง ํ (0) | 2022.05.13 |
ํฌ์๋ ํ๋ก์ ์ ๋ฆฌ๋ฒ์ค ํ๋ก์ (forward proxy, reverse proxy) (1) | 2021.08.24 |
HTTP 401(Unauthorized), 403(Forbidden) ์ฐจ์ด (0) | 2021.06.20 |