gpt4 book ai didi

postgresql - tokio-postgres 和数据库查询

转载 作者:行者123 更新时间:2023-12-03 11:26:56 28 4
gpt4 key购买 nike

有这样一个模块代码(用于处理数据库):

use tokio_postgres::{NoTls, Error};

pub async fn hello() -> Result<(), Error> {

// Connect to the database.
let (client, connection) =
tokio_postgres::connect("host=localhost user=postgres", NoTls).await?;

// The connection object performs the actual communication with the database,
// so spawn it off to run on its own.
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("connection error: {}", e);
}
});

// Now we can execute a simple statement that just returns its parameter.
let rows = client
.query("SELECT $1::TEXT", &[&"hello world"])
.await?;

// And then check that we got back the same string we sent over.
let value: &str = rows[0].get(0);
assert_eq!(value, "hello world");

Ok(())
}
问题:
在这种情况下,应该如何编写对数据库的访问?
(指南没有说任何关于它的内容 - 或者我没有完全理解它。)
https://docs.rs/tokio-postgres/0.5.5/tokio_postgres/
在这种情况下,什么机制可以保护对数据库的访问免受 sql 注入(inject)?
需要最简单的通用用例。

最佳答案

client.query(statement, params)将转换第一个参数 statement到准备好的语句并使用 params 执行它.
为了避免 sql 注入(inject),请确保所有用户数据都在第二个 params 中传递。争论。
不要这样做:

let id = "SOME DATA FROM THE USER";

let rows = client
.query(format!("SELECT * FROM SomeTable WHERE id = {}", id), &[])
.await?;
这样做:
let id = "SOME DATA FROM THE USER";

let rows = client
.query("SELECT * FROM SomeTable WHERE id = $1", &[&id])
.await?;
解释:
tokio-postgres大多数客户端方法( query*execute* )可以接受 &strStatement对于 sql 语句。如果通过 &str它将为您创建一个准备好的语句( Statement 对象)。

关于postgresql - tokio-postgres 和数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63749269/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com