* [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:
nuxsmin
2015-11-14 14:04:51 +01:00
parent a9a3964987
commit da663b933f
8 changed files with 91 additions and 68 deletions

View File

@@ -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);

View File

@@ -133,7 +133,7 @@ class AccountSearch
*/
public function setTxtSearch($txtSearch)
{
$this->_txtSearch = $txtSearch;
$this->_txtSearch = (string) $txtSearch;
}
/**

View File

@@ -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
*/

View File

@@ -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
*/

View File

@@ -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');

View File

@@ -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(

View File

@@ -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

File diff suppressed because one or more lines are too long