После проверки кода на безопасность

This commit is contained in:
2023-10-17 13:41:02 +06:00
parent 573f584ec7
commit 4ddea79113
3 changed files with 37 additions and 50 deletions

View File

@ -220,7 +220,7 @@
{ sendError('Connect error '.$_SERVER['HTTP_HOST'].': "'.$e->getMessage().'"!');
}
//Пытаемся автоматически залогинется по GUID из COOKIE
//Пытаемся автоматически залогинется по GUID из COOKIE (TODO авторизация должна быть в отдельном файле! Смотри директорию password )
/*if($_SESSION['USER_ID']==null && $_COOKIE['GUID']!=null)
{
$res = $db->query("select * from ".$Schema."p__Login(null,null,null,'".$_COOKIE['GUID']."');");
@ -269,7 +269,6 @@
if ($fn==0) //отправить метаданные клиенту по запрошенному узлу
{
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! '.$_SERVER['PHP_SELF']);
$typename=findFirstNode($reqNode, "type")->getAttribute("n");
$currNode=getMetadataNode($typename);
@ -279,42 +278,32 @@
$objXMLDocument=$currNode->ownerDocument;
//Вернём значение прав доступа для запрошенного объекта
//$allow=true;
$allow=false;
//$sql_query='select a.*,at.name from _Access a, _Actions at where a.del=false and at.id=a.action_id and at.name=\'Insert_'.$typename.'\' and a.role_id in (select group_id from _UsersRoles where user_id='.$_SESSION['USER_ID'].');'
$sql_query='select '.$Schema.'p_getaccess('.getSQLValue(gettype($_SESSION['USER_ID']),$_SESSION['USER_ID']).',\'Insert_'.$typename.'\') as allow;';
$res = $db->query($sql_query);
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
$allow_ins=false;
$allow_upd=false;
$allow_del=false;
$sql_query='select '.$Schema.'p_getaccess(:user_id1,:action_insert) as ins,'.$Schema.'p_getaccess(:user_id2,:action_update) as upd,'.$Schema.'p_getaccess(:user_id3,:action_delete) as del;';
$stmt = $db->prepare($sql);
$stmt->bindValue(':user_id1', $_SESSION['USER_ID'], PDO::PARAM_INT); //getSQLValue(gettype($_SESSION['USER_ID']),$_SESSION['USER_ID'])
$stmt->bindValue(':user_id2', $_SESSION['USER_ID'], PDO::PARAM_INT); //getSQLValue(gettype($_SESSION['USER_ID']),$_SESSION['USER_ID'])
$stmt->bindValue(':user_id3', $_SESSION['USER_ID'], PDO::PARAM_INT); //getSQLValue(gettype($_SESSION['USER_ID']),$_SESSION['USER_ID'])
$stmt->bindValue(':action_insert', 'Insert_'.$typename, PDO::PARAM_STR);
$stmt->bindValue(':action_update', 'Update_'.$typename, PDO::PARAM_STR);
$stmt->bindValue(':action_delete', 'Delete_'.$typename, PDO::PARAM_STR);
$res=$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
$allow=$allow || ($row['allow'] == 't');
$allow_ins=$row['ins'] == 't';
$allow_upd=$row['upd'] == 't';
$allow_del=$row['del'] == 't';
}
$xmlAttr = $objXMLDocument->createAttribute("ins"); //insert
$xmlAttr->nodeValue = $allow ? "1" : "0";
$xmlAttr->nodeValue = $allow_ins ? "1" : "0";
$currNode->setAttributeNode($xmlAttr);
$allow=false;
//$sql_query='select a.*,at.name from _Access a, _Actions at where a.del=false and at.id=a.action_id and at.name=\'Update_'.$typename.'\' and a.role_id in (select group_id from _UsersRoles where user_id='.$_SESSION['USER_ID'].');';
$sql_query='select '.$Schema.'p_getaccess('.getSQLValue(gettype($_SESSION['USER_ID']),$_SESSION['USER_ID']).',\'Update_'.$typename.'\') as allow;';
$res = $db->query($sql_query);
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
{
$allow=$allow || ($row['allow'] == 't');
}
$xmlAttr = $objXMLDocument->createAttribute("upd"); //insert
$xmlAttr->nodeValue = $allow ? "1" : "0";
$xmlAttr = $objXMLDocument->createAttribute("upd"); //update
$xmlAttr->nodeValue = $allow_upd ? "1" : "0";
$currNode->setAttributeNode($xmlAttr);
$allow=false;
//$sql_query='select a.*,at.name from _Access a, _Actions at where a.del=false and at.id=a.action_id and at.name=\'Delete_'.$typename.'\' and a.role_id in (select group_id from _UsersRoles where user_id='.$_SESSION['USER_ID'].');';
$sql_query='select '.$Schema.'p_getaccess('.getSQLValue(gettype($_SESSION['USER_ID']),$_SESSION['USER_ID']).',\'Delete_'.$typename.'\') as allow;';
$res = $db->query($sql_query);
while ($row = $res->fetch(PDO::FETCH_ASSOC))// $row - ассоциативный массив значений, ключи - названия столбцов
{
$allow=$allow || ($row['allow'] == 't');
}
$xmlAttr = $objXMLDocument->createAttribute("del"); //delete
$xmlAttr->nodeValue = $allow ? "1" : "0";
$xmlAttr->nodeValue = $allow_del ? "1" : "0";
$currNode->setAttributeNode($xmlAttr);
$allow=true;
@ -340,7 +329,6 @@
}else
if ($fn==1) //вставка записи (результат id записи)
{
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! '.$_SERVER['PHP_SELF']);
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
$typename=findFirstNode($reqNode,"type")->getAttribute("n");
@ -448,7 +436,6 @@
if ($fn==2) //редактирование (результат id записи)
{
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! '.$_SERVER['PHP_SELF']);
$nodeType=findFirstNode($reqNode,"type");
$typename=$nodeType->getAttribute("n");
@ -558,7 +545,6 @@
if ($fn==3) //удаление (результат id записи)
{
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! '.$_SERVER['PHP_SELF']);
$nodeType=findFirstNode($reqNode,"type");
$typename=$nodeType->getAttribute("n");
@ -597,7 +583,6 @@
if ($fn==4 || $fn==11) //взять данные из базы по переданным значениям фильтра ($fn==11 для обновления записи у клиента после вставки или редактировании)
{
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! 4'.$_SERVER['PHP_SELF']);
$rowspagecount = 100; //записей на страницу
$nTypeR=findFirstNode($reqNode,'type');
@ -746,7 +731,6 @@
if ($fn==5) //вернуть клиенту данные по id для редактирования одной записи
{
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! '.$_SERVER['PHP_SELF']);
$sql_query='';
$node=findFirstNode($reqNode,'type');
@ -858,7 +842,6 @@
if ($fn==6) //вернуть клиенту данные колонки таблицы для заполнения выпадающего списка SELECT либо выборка названия поля типа object
{
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError('Вы не авторизованы! '.$_SERVER['PHP_SELF']);
$tNodeR=findFirstNode($reqNode,'type');
$typename=$tNodeR->getAttribute("n"); //Название принятого узла
@ -1125,14 +1108,15 @@ if ($code!=$_POST['code']) return new AuthError('invalid code');
}
session_write_close(); //Разблокируем сессионный файл так как запросы могут быть достаточно долгими
//if (!isset($_SESSION['USER_ID']) || $_SESSION['USER_ID']=='') sendError(trt('You are not logged in!'));
//Выбираем информацию о текущем пользователе
$name='';
$sql="select Coalesce(surname,'') || ' ' || Coalesce(name,'') || ' ' || Coalesce(patronymic,'') as name from ".$Schema."_users where id=".$_SESSION['USER_ID'].";";
$res = $db->query($sql);
if($res->rowCount()>0)
{ $result = $res->fetch(PDO::FETCH_ASSOC);
$sql="select Coalesce(surname,'') || ' ' || Coalesce(name,'') || ' ' || Coalesce(patronymic,'') as name from ".$Schema."_users where id=:user_id;";
$stmt = $db->prepare($sql);
$stmt->bindValue(':user_id', $_SESSION['USER_ID'], PDO::PARAM_INT);
$res=$stmt->execute();
if($res && $stmt->rowCount()>0)
{ $result = $stmt->fetch(PDO::FETCH_NUM);
$name='<i>'.$result['name'].'</i><br>';
}
$res=null; //Чтоб сработал сборщик мусора, а то вываливается ошибка: "Cannot execute queries while other unbuffered queries are active".

View File

@ -102,20 +102,24 @@ function getAccess($key)
global $db;
$result=false;
$sql="select main.p_getaccess(:user_id,:key) as acc;";
$stmt = $db->prepare($sql);
if(isset($_SESSION['USER_ID']))
$sql="select main.p_getaccess(".$_SESSION['USER_ID'].",'".$key."') as acc;";
$stmt->bindValue(':user_id', $_SESSION['USER_ID'], PDO::PARAM_INT);
else
$sql="select main.p_getaccess(0,'".$key."') as acc;";
$stmt->bindValue(':user_id', 0, PDO::PARAM_INT);
$stmt->bindValue(':key', $key, PDO::PARAM_STR);
$res=null;
try
{
$res = $db->query($sql);
$res=$stmt->execute();
}catch (Exception $e)
{
echo $e->getMessage();
}
if($res!=NULL && $res->rowCount()>0)
if($res && $stmt->rowCount()>0)
{
while ($row = $res->fetch(PDO::FETCH_NUM))
while ($row = $stmt->fetch(PDO::FETCH_NUM))
{
$result=$row[0];
}

View File

@ -120,7 +120,6 @@ while ($row = $res->fetch(PDO::FETCH_ASSOC))
{
for($j=0;$j<count($tbl->fields);$j++)
{
//print $tbl->fields[$j]->name.'='.$tbl->fields[$j]->getValue().'<br>';
$stmtU->bindValue(':'.$tbl->fields[$j]->name, $tbl->fields[$j]->getValue(), $tbl->fields[$j]->getPDOType());
}
print '<br>Update ';