KENRO(ケンロー)byFlatt Security
新卒開発エンジニアへのセキュアコーディング挑戦状 PRESENTED BY KENRO

株式会社Flatt Securityから、Web開発エンジニアとして就職予定の皆さんに是非知ってほしい セキュアコーディングの基礎知識のクイズを3問用意しました。 全問正解して、同期や友達にシェアしよう!

挑戦 その1
クエリパラメータの値がDOMに反映されるアプリケーション

以下のように、クエリパラメータの入力値がDOMに反映される機能がとあるWebサイト(以下、サイトA)で提供されていました。

クエリパラメータが「KENRO」なので、「KENROさん、お誕生日おめでとう!」と画面に表示されている

このサーバーの実装が以下のソースコードのようなとき、 どのようなリスクがあると考えられるでしょうか。

const http = require('node:http');
const {URL} = require('node:url');
const portNum = 8082;
const host = 'localhost';
const server = http.createServer(function(request, response) {
    const url = new URL(`http://${host}:${portNum}${request.url}`);
    const name = url.searchParams.get('name') || "";

    response.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    if(name === "") {
        response.end('<h1>誰かさん、お誕生日おめでとう!!</h1>');
    }else{
        response.end(`<h1>${decodeURI(name)}さん、お誕生日おめでとう!!</h1>`);
    }
});

console.log(`access http:/${host}:${portNum}`);

server.listen(portNum);