猫史档案馆


关于SQL排行榜的问题

用户:NysidlaNysidla查看:4 回复:7 评论:4 创建时间:2023-04-04T18:53:17


我在测试排行榜的时候,发现排行榜无法正常排序

center_image

代码:

async function poll(func, msg) {
    while (true) {
        try {
            return await func()
        } catch (e) {
            const m = e.message
            if (m.includes('timeout') || m.includes('relation')) {
                world.say(m)
            } else {
                world.say(msg || e.stack)
            }
        }
        await sleep(1000)
    }
}

async function getTop(entity, name, value) {
    let list = [], num = 0, entityTop = 0
    for (let top of await poll(() => db.sql`SELECT * FROM yctb ORDER BY ${name} DESC`)) {
        num++
        if (top.userName == entity.player.name) entityTop = num
        list.push(`第${num}名  ${top.epithet} | ${top[name]}${value[0]}`)
    } while (1) {
        let top = await selectdialog(entity, `${value[1]}排行榜`, `你的排行:第${entityTop}名`, list.concat('返回'))
        if (!top || top.value == '返回') break
    }
}





//调用:await getTop(entity, "money", ['元', '金钱'])

改成将"${name}"改成字段后就可以了:

async function poll(func, msg) {
    while (true) {
        try {
            return await func()
        } catch (e) {
            const m = e.message
            if (m.includes('timeout') || m.includes('relation')) {
                world.say(m)
            } else {
                world.say(msg || e.stack)
            }
        }
        await sleep(1000)
    }
}

async function getTop(entity, name, value) {
    let list = [], num = 0, entityTop = 0
    for (let top of await poll(() => db.sql`SELECT * FROM yctb ORDER BY money DESC`)) {
        num++
        if (top.userName == entity.player.name) entityTop = num
        list.push(`第${num}名  ${top.epithet} | ${top[name]}${value[0]}`)
    } while (1) {
        let top = await selectdialog(entity, `${value[1]}排行榜`, `你的排行:第${entityTop}名`, list.concat('返回'))
        if (!top || top.value == '返回') break
    }
}

center_image

为什么会这样?


回复

上一页1 页 / 共 1下一页
NysidlaNysidla

ddd

点赞0


评论


NysidlaNysidla

在线等)

点赞0


评论


NysidlaNysidla

ddd

点赞0


评论


NysidlaNysidla

ddd

点赞0


评论


145a145a

改成name字段治标不治本。

点赞1


评论


SCS_user_LoeheodVOQSCS_user_LoeheodVOQ

db.sq([`SELECT * FROM yctb ORDER BY ${name} DESC`])

这样试试?

点赞0


评论


SCS_user_LoeheodVOQSCS_user_LoeheodVOQ

就是一个sql保护机制,当你执行sql语句的时候,如果是有个玩家的名字叫“);DELETE * FROM players;INSERT INTO players('111'”,你的代码是INSERT INTO players VALUES (${name}),就会变成“INSERT INTO players VALUES ();DELETE * FROM players;INSERT INTO players('111')”(这样好像是能执行成功的,只是举个例子),players表就会被删,这个就叫xss注入。为了防止xss注入,代码岛会智能给外界加入的东西加上引号什么的(前提是你的调用格式是db.sql``,这种格式db.sql函数就会知道哪些是代码里写的,哪些是外面加的),这也是为什么表名不能用外界的东西,会报错(这个功能其实是sql内部的,不是代码岛加的)。如果你写的是a=114; db.sql([`${a}`]),他就会以为你输入的是db.sql`114`而不是db.sql`${a}`,就不会加东西了

点赞1


评论