用户:
Nysidla查看:4 回复:7 评论:4 创建时间:2023-04-04T18:53:17
我在测试排行榜的时候,发现排行榜无法正常排序

代码:
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
}
}

为什么会这样?
SCS_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
评论