Я хотел упростить реализацию частей интерфейса, которые контролируют базу данных, потому что создание отдельного подготовленного файла выписки для каждого простого запроса становилось действительно трудоемким. Поэтому я сделал этот простой скрипт для перехвата ajax запросов POST, используя эту php библиотеку, чтобы я мог просто отправить ajax запросов, таких как {
db:'main',
table:'blog',
action:'delete',
query: {
id: 299
}
(DELETE FROM blog WHERE id=299; in 'main' database)
, чтобы получить некоторые управление базой данных на внешнем интерфейсе.
Теперь, если этот тип сценария используется только на административном портале сайта, на другом виртуальном хосте с несколькими этапами аутентификации, будет ли это плохой практикой? Я не смог придумать ничего точного, что могло бы go ошибиться, но все же чувствую себя неуверенно по этому поводу.
Также обратите внимание на переменную $perm
, которая указывает, какие действия разрешены в таблице.
admin.example.com/ajax/db_actions.php
header('Content-Type: application/json');
$perm = [
'main' => [
'blog' => [
'delete',
'insert',
'select'
]
]
];
$q = $_POST;
if(empty($q['db']) || empty($q['table']) || empty($q['action']) || empty($q['query'])) {
http_response_code(400);
die();
}
if(!in_array($q['action'], $perm[$q['db']][$q['table']])) {
http_response_code(401);
die();
}
require_once('Database.php');
$db = new Database($q['db'], "username", "password", "localhost");
if($q['action'] == 'select') {
$res = $db->select($q['table'], ...$q['query'])->result();
if($res) {
die(json_encode($res, 1));
}
} else if($q['action'] == 'insert') {
$res = $db->insert($q['table'], ...$q['query'])->id();
if($res) {
die(json_encode($res, 1));
}
} else if($q['action'] == 'update') {
if($db->update($q['table'], ...$q['query'])) {
die(json_encode(true));
}
} else if($q['action'] == 'delete') {
if($db->delete($q['table'], $q['query'])) {
die(json_encode(true));
}
} else {
http_response_code(400);
die();
}