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

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

View File

@ -102,20 +102,24 @@ function getAccess($key)
global $db; global $db;
$result=false; $result=false;
$sql="select main.p_getaccess(:user_id,:key) as acc;";
$stmt = $db->prepare($sql);
if(isset($_SESSION['USER_ID'])) 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 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 try
{ {
$res = $db->query($sql); $res=$stmt->execute();
}catch (Exception $e) }catch (Exception $e)
{ {
echo $e->getMessage(); 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]; $result=$row[0];
} }

View File

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