tokio-postgre и запрос к базе
Есть такой код модуля(для работы с базой данных):
use tokio_postgres::{NoTls, Error};
pub async fn hello() -> Result<(), Error> {
//println!("hello() from db.rs");
// 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?;
println!("{:?}", rows);
// 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 иньекций?
Необходим самый простой пример использования в общем.
Ответы (1 шт):
joxi.ru/YmEgJPahMMWOlA суть следующая. есть таблица в базе - вопрос как обратится к ней и вытащить что то или наоборот положить туда + что бы это был правильный безопасный подход?
В первом приближении достаточно просто исполнять обычные запросы с помощью execute/query:
let num = client.execute( "INSERT INTO my_first_table (first_column, second_column) \
VALUES ($1, $2)",
&[&"mouse", &12] ).await?;
assert_eq!(num, 1);
let rows = client.query( "SELECT first_column, second_column FROM my_first_table \
WHERE first_column != $1",
&[&"Cheese"] ).await?;
for r in rows.iter() {
let row: (&str, i64) = (r.get(0), r.get(1));
println!("{} : {}", row.0, row.1);
}
Client::execute() и Client::query() сами экранируют все символы/кавычки и т.п. Для определённых ситуаций стоит использовать подготовку запросов, конвееризацию итп, но и исполнение одиночных запросов — абсолютно нормальная практика.
Не стоит напрямую подготавливать запрос с помощью format!, а затем исполнять его с помощью Client::simple_query(). Это грозит соответствующим весельем:
client.simple_query( format!("SELECT * FROM my_first_table WHERE first_column != '{}'",
"Cheese'; DROP TABLE my_first_table; --" ));