mirror of
https://github.com/nuxsmin/sysPass.git
synced 2026-03-04 07:34:09 +01:00
* [MOD] Modified search bahaviour to avoid some "INVALID QUERY" responses because the security token was not set quickly enough by the client. JSON is now used for search response.
* [FIX] Fixed integer parsing when an ip address was given as search text.
This commit is contained in:
@@ -27,6 +27,7 @@ use SP\Controller\SearchC;
|
||||
use SP\Core\Init;
|
||||
use SP\Http\Request;
|
||||
use SP\Core\SessionUtil;
|
||||
use SP\Http\Response;
|
||||
use SP\Util\Util;
|
||||
|
||||
define('APP_ROOT', '..');
|
||||
@@ -42,9 +43,15 @@ if (!Init::isLoggedIn()) {
|
||||
$sk = \SP\Http\Request::analyze('sk', false);
|
||||
|
||||
if (!$sk || !SessionUtil::checkSessionKey($sk)) {
|
||||
die('<div class="error round">' . _('CONSULTA INVÁLIDA') . '</div>');
|
||||
Response::printJSON(_('CONSULTA INVÁLIDA'));
|
||||
}
|
||||
|
||||
$Controller = new SearchC();
|
||||
$Controller->getSearch();
|
||||
$Controller->view();
|
||||
|
||||
$data = array(
|
||||
'sk' => SessionUtil::getSessionKey(),
|
||||
'html' => $Controller->render()
|
||||
);
|
||||
|
||||
Response::printJSON($data, 0);
|
||||
@@ -133,7 +133,7 @@ class AccountSearch
|
||||
*/
|
||||
public function setTxtSearch($txtSearch)
|
||||
{
|
||||
$this->_txtSearch = $txtSearch;
|
||||
$this->_txtSearch = (string) $txtSearch;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -104,13 +104,21 @@ abstract class Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* Renderizar los datos de la plantilla
|
||||
* Renderizar los datos de la plantilla y mostrarlos
|
||||
*/
|
||||
public function view()
|
||||
{
|
||||
echo $this->view->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Renderizar los datos de la plantilla y devolverlos
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
return $this->view->render();
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener los datos para la vista de depuración
|
||||
*/
|
||||
|
||||
@@ -36,20 +36,61 @@ use SP\Core\Init;
|
||||
*/
|
||||
class Request
|
||||
{
|
||||
/**
|
||||
* Comprobar el método utilizado para enviar un formulario.
|
||||
*
|
||||
* @param string $method con el método utilizado.
|
||||
*/
|
||||
public static function checkReferer($method)
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] !== strtoupper($method)
|
||||
|| !isset($_SERVER['HTTP_REFERER'])
|
||||
|| !preg_match('#' . Init::$WEBROOT . '/.*$#', $_SERVER['HTTP_REFERER'])
|
||||
) {
|
||||
Init::initError(_('No es posible acceder directamente a este archivo'));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Analizar un valor encriptado y devolverlo desencriptado
|
||||
*
|
||||
* @param $param
|
||||
* @return string
|
||||
*/
|
||||
public static function analyzeEncrypted($param)
|
||||
{
|
||||
$encryptedData = self::analyze($param, '', false, false, false);
|
||||
|
||||
if ($encryptedData === '') {
|
||||
return '';
|
||||
}
|
||||
|
||||
try {
|
||||
// Desencriptar con la clave RSA
|
||||
$CryptPKI = new CryptPKI();
|
||||
$clearData = $CryptPKI->decryptRSA(base64_decode($encryptedData));
|
||||
} catch (\Exception $e) {
|
||||
return $encryptedData;
|
||||
}
|
||||
|
||||
return $clearData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obtener los valores de variables $_GET y $_POST
|
||||
* y devolverlos limpios con el tipo correcto o esperado.
|
||||
*
|
||||
* @param string $param con el parámetro a consultar
|
||||
* @param mixed $default valor por defecto a devolver
|
||||
* @param bool $check comprobar si el parámetro está presente
|
||||
* @param mixed $force valor devuelto si el parámeto está definido
|
||||
* @param bool $sanitize escapar/eliminar carácteres especiales
|
||||
* @param string $param con el parámetro a consultar
|
||||
* @param mixed $default valor por defecto a devolver
|
||||
* @param bool $check comprobar si el parámetro está presente
|
||||
* @param mixed $force valor devuelto si el parámeto está definido
|
||||
* @param bool $sanitize escapar/eliminar carácteres especiales
|
||||
* @return mixed si está presente el parámeto en la petición devuelve bool. Si lo está, devuelve el valor.
|
||||
*/
|
||||
public static function analyze($param, $default = '', $check = false, $force = false, $sanitize = true)
|
||||
{
|
||||
switch($_SERVER['REQUEST_METHOD']){
|
||||
switch ($_SERVER['REQUEST_METHOD']) {
|
||||
case 'GET':
|
||||
if (!isset($_GET[$param])) {
|
||||
return ($force) ? !$force : $default;
|
||||
@@ -83,15 +124,17 @@ class Request
|
||||
*/
|
||||
private static function parse($value, $default, $sanitize)
|
||||
{
|
||||
if (is_array($value)){
|
||||
foreach($value as &$data){
|
||||
if (is_array($value)) {
|
||||
foreach ($value as &$data) {
|
||||
self::parse($data, $default, $sanitize);
|
||||
}
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
if ((is_numeric($value) && !is_string($default)) || is_numeric($default)) {
|
||||
if ((is_numeric($value) || is_numeric($default))
|
||||
&& !is_string($default)
|
||||
) {
|
||||
return intval($value);
|
||||
}
|
||||
|
||||
@@ -101,44 +144,13 @@ class Request
|
||||
}
|
||||
|
||||
/**
|
||||
* Comprobar el método utilizado para enviar un formulario.
|
||||
* Comprobar si se realiza una recarga de la página
|
||||
*
|
||||
* @param string $method con el método utilizado.
|
||||
* @return bool
|
||||
*/
|
||||
public static function checkReferer($method)
|
||||
public static function checkReload()
|
||||
{
|
||||
if ($_SERVER['REQUEST_METHOD'] !== strtoupper($method)
|
||||
|| !isset($_SERVER['HTTP_REFERER'])
|
||||
|| !preg_match('#' . Init::$WEBROOT . '/.*$#', $_SERVER['HTTP_REFERER'])
|
||||
) {
|
||||
Init::initError(_('No es posible acceder directamente a este archivo'));
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Analizar un valor encriptado y devolverlo desencriptado
|
||||
*
|
||||
* @param $param
|
||||
* @return string
|
||||
*/
|
||||
public static function analyzeEncrypted($param)
|
||||
{
|
||||
$encryptedData = self::analyze($param, '', false, false, false);
|
||||
|
||||
if ($encryptedData === ''){
|
||||
return '';
|
||||
}
|
||||
|
||||
try {
|
||||
// Desencriptar con la clave RSA
|
||||
$CryptPKI = new CryptPKI();
|
||||
$clearData = $CryptPKI->decryptRSA(base64_decode($encryptedData));
|
||||
} catch (\Exception $e) {
|
||||
return $encryptedData;
|
||||
}
|
||||
|
||||
return $clearData;
|
||||
return (self::getRequestHeaders('Cache-Control') == 'max-age=0');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -174,16 +186,6 @@ class Request
|
||||
return $headers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Comprobar si se realiza una recarga de la página
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function checkReload()
|
||||
{
|
||||
return (self::getRequestHeaders('Cache-Control') == 'max-age=0');
|
||||
}
|
||||
|
||||
/**
|
||||
* Comprobar si existen parámetros pasados por POST para enviarlos por GET
|
||||
*/
|
||||
|
||||
@@ -229,9 +229,6 @@
|
||||
<?php endif; ?>
|
||||
<script>
|
||||
$(function () {
|
||||
// Actualizar el token de seguridad
|
||||
$("#frmSearch :input[name='sk']").val('<?php echo $sk; ?>');
|
||||
|
||||
$('#data-search-header').find('.sort-down').each(function () {
|
||||
$(this).click(function () {
|
||||
var key = $(this).parent().data('key');
|
||||
|
||||
@@ -63,17 +63,20 @@
|
||||
sysPassUtil.Common.clearSearch(1);
|
||||
sysPassUtil.Common.accSearch(0, e)
|
||||
});
|
||||
|
||||
$('#frmSearch #btnClear').click(function (e) {
|
||||
sysPassUtil.Common.clearSearch();
|
||||
sysPassUtil.Common.accSearch(0, e);
|
||||
})
|
||||
});
|
||||
|
||||
$('#frmSearch input:text:visible:first').focus();
|
||||
$('#frmSearch #txtSearch').on('keyup', function (e) {
|
||||
sysPassUtil.Common.accSearch(1, e)
|
||||
});
|
||||
|
||||
$('#frmSearch #rpp').on('change', function (e) {
|
||||
sysPassUtil.Common.accSearch(0, e);
|
||||
})
|
||||
});
|
||||
|
||||
<?php if ( $showGlobalSearch ): ?>
|
||||
$('#chkgsearch').click(
|
||||
|
||||
@@ -223,12 +223,18 @@ sysPass.Util.Common = function () {
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
dataType: 'html',
|
||||
dataType: 'json',
|
||||
url: APP_ROOT + '/ajax/ajax_search.php',
|
||||
data: frmData,
|
||||
success: function (response) {
|
||||
$('#resBuscar').html(response);
|
||||
success: function (json) {
|
||||
$('#resBuscar').html(json.html);
|
||||
$('#resBuscar').css("max-height", $('html').height() - windowAdjustSize);
|
||||
|
||||
|
||||
if (typeof json.sk !== 'undefined') {
|
||||
// Actualizar el token de seguridad
|
||||
$("#frmSearch").find(":input[name='sk']").val(json.sk);
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
$('#resBuscar').html(resMsg("nofancyerror"));
|
||||
@@ -1298,7 +1304,7 @@ sysPass.Util.Common = function () {
|
||||
// Función para mostrar los datos de un registro
|
||||
var viewWiki = function (pageName, actionId, sk) {
|
||||
|
||||
var data = {'pageName' : pageName, 'actionId': actionId, 'sk': sk, 'isAjax': 1};
|
||||
var data = {'pageName': pageName, 'actionId': actionId, 'sk': sk, 'isAjax': 1};
|
||||
var url = APP_ROOT + '/ajax/ajax_wiki.php';
|
||||
|
||||
$.ajax({
|
||||
|
||||
2
js/functions.min.js
vendored
2
js/functions.min.js
vendored
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user