๐ŸŒ Web

[Java] ๋ฌธ์ž ์ด์Šค์ผ€์ด์Šค ์ฒ˜๋ฆฌํ•˜๊ธฐ (feat.html)

Hugehoo 2023. 12. 29. 09:44

 

์ž๋ฐ”/์Šคํ”„๋ง๋ถ€ํŠธ ํ™˜๊ฒฝ์—์„œ html ํ…œํ”Œ๋ฆฟ์„ ๋‹ค๋ฃจ๋˜ ์ค‘ ๋‚ด๋ถ€ ๋ฌธ์ž์—ด์—์„œ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

๋ฌธ์ œ๊ฐ€ ๋œ ํŠน์ˆ˜๋ฌธ์ž๋Š” &(ampersand) ์˜€๋‹ค. ํ•ด๋‹น ๊ธฐํ˜ธ๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜์ง€ ๋ชปํ–ˆ๊ณ  html ์˜ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ๋ณ„๋„ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹จ ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค.

์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋ž€ HTML ๋ฌธ์„œ์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋ฌธ์ž๊ฐ€ HTML ํƒœ๊ทธ๋‚˜ ์—”ํ‹ฐํ‹ฐ๋กœ ์ธ์‹๋˜์ง€ ์•Š๊ณ  ํ…์ŠคํŠธ ๊ทธ ์ž์ฒด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” HTML ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

 

  • &lt; : < ๊ธฐํ˜ธ๋ฅผ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
  • &gt; : > ๊ธฐํ˜ธ๋ฅผ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
  • & : & ๊ธฐํ˜ธ๋ฅผ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
  • &quot; : " ๊ธฐํ˜ธ๋ฅผ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ
  • &apos; : ' ๊ธฐํ˜ธ๋ฅผ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ

 

์•„๋ž˜ ํ‘œ๋Š” ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ Escape ๋ฌธ์ž์˜ ์˜ˆ์‹œ๋‹ค.

 

๋ฌธ์ž ๋Œ€์ฒด ๋ฌธ์ž
!  
' &apos;
" &quot;
& &amp;
< &lt;
> &gt;

 

 

Java code

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ String ์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. 

์˜ˆ์‹œ๋กœ ๋ช‡๊ฐ€์ง€์˜ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž(&, <, >, \) ๋งŒ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์—ฌ replace ํ–ˆ๋‹ค.

public String htmlEscape(String parameters) {
    return parameters.replaceAll("&", "&amp;")
            .replaceAll("<", "&lt;")
            .replaceAll(">", "&gt;")
            .replaceAll("\"", "&quot;");
}

 

 

๊ฐœ์„ ๋œ 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("&", "&amp;");
    map.put("<", "&lt;");
    map.put(">", "&gt;");
    map.put("\"", "&quot;");

    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();
}

 

 

 

๊ฐœ์„ ํ•  ์ 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋ช‡ ๊ฐ€์ง€์˜ ํŠน์ˆ˜ ๋ฌธ์ž๋งŒ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์—ฌ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์น˜ํ™˜ํ–ˆ๋‹ค.

๋งŒ์•ฝ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฌธ์ž ์ด์™ธ์˜ ํŠน์ˆ˜ ๋ฌธ์ž๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•˜๋“œ์ฝ”๋”ฉ ๋ฐฉ์‹์ด ์•„๋‹Œ ๋” ๋งŽ์€ ์ผ€์ด์Šค์˜ ํŠน์ˆ˜ ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ด์•ผ๊ฒ ๋‹ค.