使用参数化查询和输入验证来防止SQL注入。
为确保请求不包含恶意代码,可以使用输入验证。这是一项非常重要的安全措施,可防止恶意用户通过发送特殊字符来执行攻击。在下面的代码示例中,我们可以看到如何使用 Joi 库进行输入验证:
import Joi from 'joi';
const validateUserInput = async (data) => {
const schema = Joi.object({
username: Joi.string()
.min(3)
.max(30)
.required(),
password: Joi.string()
.min(8)
.max(64)
.required(),
});
return await schema.validateAsync(data);
};
app.post('/user', async (req, res) => {
try {
const userInput = await validateUserInput(req.body);
// Insert the user into the database using Prisma
const createdUser = await prisma.user.create({
data: {
username: userInput.username,
password: userInput.password,
},
});
res.json(createdUser);
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Internal server error' });
}
});
在这个示例中,我们定义了一个 Joi 模式,该模式定义了我们将接收什么样的数据。该模式验证了用户名和密码是否符合要求。如果用户向我们发送包含恶意代码的请求,Joi 将捕获并抛出错误,我们可以在 catch 块中处理它。
此外,我们还可以使用参数化查询来防止 SQL 注入攻击。下面是一个简单的示例代码:
app.get('/users', async (req, res) => {
// Get the search query from the URL
const { q } = req.query;
// Keep it simple for now, don't allow any special characters
const sanitized = q.replace(/[^a-zA-Z0-9 ]/g, '');
// Use Prisma to search the database
const users = await prisma.user.findMany({
where: {
OR: [
{
username: {
contains: sanitized,
},
},
{
email: {
contains: sanitized,
},
},
],
},
});
res.json(users);
});
在上述例子中,我们可以使用正则表达式对输入字符串进行过滤,并去掉特定的字符。该字符串已经被“净化”,所以不会引起任何 SQL 注入攻击。
总之,使用 Joi 进行输入验证和参数化查询使用 Prisma 进行安全查询,在代码中特别处理输入,可以防止 SQL 注入等安全问题。