Cesar Systems

Herramientas Informaticas

Función PHP que cuenta el numero de filas en una consulta

php-logo

Para obtener estadísticas necesitamos el numero de filas de una consulta, ejemplo, numero total de usuarios activos etc.

A continuación les dejo la función que obtiene el numero de filas de una consulta

Supongamos que el archivo se llama consulta.php y esta en la carpeta modelo

//LOS VALORES QUE PONDRIAMOS AQUI SERIA EL CAMPO Y LUEGO EL DATO CON EL QUE QUEREMOS COMPARAR

function datoBuscar($campo,$dato){

    

    include ("configuracion.php");

    $enlace = conectar_mysql($servidor,$usuario,$contra,$bd);

        

    $alumnos = "SELECT $campo FROM vmlzj_comprofiler WHERE $campo='$dato'";

    $resultado = mysql_query($alumnos,$enlace);

        

    $numeroFilas = mysql_num_rows($resultado);

        

    return $numeroFilas;

}

Para mandarlo llamar seria de la siguiente manera

 

<?php 

include ("conexionmysql.php");

//SE INCLUYE EL ARCHIVO

include ("modelo/consultas.php");

 

$egreT = datoBuscar("campo","datoAcomparar"); 

 

 

?>

Les dejo también la función de conectar_mysql()

<?php

/*******************************************************************************************************************

*                             DESCRIPCION: ESTE ARCHIVO TIENE LA FUNCIONDE CONECTAR CON LA BASE DE DATOS.             *

*                             PROGRAMADOR:                                                                         *

*                             FECHA:          01/07/2012                                                               *

********************************************************************************************************************/

 

function conectar_mysql($direccion,$usuario,$password,$basededatos)

    {

    global $enlace;

    if(!($enlace=mysql_connect($direccion,$usuario,$password)))

        {

        echo " alert('error de conexion')";

        exit();

        }

    if(!(mysql_select_db($basededatos,$enlace)))

        {

        echo " alert('error al conectar con la base de datos')";

        exit();

        }

    return $enlace;

    }

?>

PACK DE ESCENARIOS PARA AGE OF EMPIRES II THE CONQUERORS

BUEN DIA AMIGOS!!!! Estaba recordando los buenos tiempos de la secundaria cuando yo y mis amigos nos las pinteábamos para ir al MUNDONET “Ciber Cafe” de che ríos, para aventarnos una partidilla de Age Of Empirers.

Bueno a todo esto les quiero dejar algo que encontré entre mis respaldos de una vieja, de una vieja computadora que prendí y me trajo recuerdos :’), les dejo el pack de escenario con los cuales jugamos en línea allá en aquellos tiempos, espero y lo disfruten si es que aun las nuevas generaciones siguen jugando este espectacular juego.

A continuación viene la lista de escenarios

() jose i tincho.scx
(DD) Infantery Hell Blood V1.scx
(HG)CBAV11.scx
(HG)CBAV12.scx
(IGZ)   CBAV12.scx
(IGZ)  CBA V12.scx
(IGZ)  CBAV12 (Con banderas).scx
(IGZ)  CBAV12.scx
(IGZ)  CBAV13.scx
(IGZ) CBA   V12.scx
(IGZ) CBA  V12.scx
(IGZ) CBA 13,5.scx
(IGZ) CBAV10.scx
(IGZ) CBAV12 .scx
(IGZ) CBAV12.scx
(IGZ) CBAV12_AOC.scx
(IGZ) CBAV13 .scx
(IGZ) CBAV13.scx
(IGZ) CBAV9.scx
(IGZ) Defend The Empire.scx
(IGZ) GwarzV2.scx
(IGZ) Path Blood Heroes.scx
(IGZ) Rambit CBG NoS AD.scx
(IGZ) Smosh V14.scx
(IGZ) Veteran BloodV6.scx
(IGZ) Veteran BloodV8.scx
(IGZ)CBAV12.scx
–   UDP_PRISON_BREAK_.scx
– Path BlooD HerooeS -.scx
– °-°Gods Path Blood~Aldeano~Oficial°-°.sc
-┼-InfanteryHellBloodOficial-┼-.scx
11111111111.scx
=V= CBA.scx
@-+-Harry Potter III  RPG version 1.3.scx
@-+-Harry Potter III  RPG version 1.3a.scx
@–+–Harry Potter III RPG version 1·5.scx
@-Harry potter III RPG version 8.50-@.scx
Ancient – [TD]- new version Medios 2k.scx
Carrera de Obstaculos.scx
Castle Blood II Auto-vNBv3.scx
Castle Norte vs Sur.scx
Ciudades Divididas.scx
default0.scx
deStRuYe  La MaLdiTa ToRRe _V_4.0.scx
dEStRuYe La  MaLdIta ToRRe _V_4.0.scx
deStRuYe La MaLdIta ToRRe _V_4.0.scx
deStRuYe La MaLdIta ToRRe _V_4.0.scx
EXCALIBUR IV (Official).scx
Green Arabia.scx
Guerra del pacifico.scx
Infantery Hell Blood V1.scx
jose.scx
JOSE2.scx
KING MOVES Green Fix-vNBv3.scx
lol xd.scx
manu.scx
masacre_infinita.scx
Masakre Infinita v. Oficial. 5 min.scx
nomada.scx
Path Blood  Heroes 4-8.scx
Path Blood Heroes  2008.scx
Path Blood Heroes 4-8.scx
PTO BlueSea v4,2.scx
PTO PolarExpress v5,1.scx
RAMBIT CB.scx
scenario.inf
Scenario.rar
Simpsons 3 RPG FIXED (USE THIS ONE).scx
Soldier Store- Platinum Pure (4 Players).s
SoldierStore(v2)NoHoRseS-vNBv3.scx
SUPER JUEGO 2009!!ORIJINAL.scx
TD ANCIENT 2K.scx
TD ANCIENT 4’3K.scx
TD ANCIENT 4-K.scx
Td Paris Ver 14 Fixter–C Hard! Beta.scx
Td Paris Ver 15 Fixter–C Ultra-H.scx
tincho.scx
Udaprey Pantanos Hard 5.2.scx
Udaprey Utopia Oficial 3v8 español 1,3.scx
Udaprey_Utopia_Oficial_3v8_español_1,3.scx
Uruk Hai TD V[SpX]28,3.scx
VeTeRaN BLooD ¬ PeRFeCTiON!!!.scx
warrior defence 2007 + recursos.scx
WORLD RISK (TheConquerors.es).scx
XERO TD 1500k -7 player game.scx
[E] World Risk 40 Wonders 2,5.scx
[IGZ] CBAV13.scx
[xxx]-Rambit-CB-Gold-Edition-[xxx].scx
_V23  [RPG]—WORLD Sha—-[AOC]  V23_.scx
~~SIMPSONS RPG V3,0~~-vNBv3.scx
°-°Gods Path Blood~Aldeano~Oficial°.scx
»ÌÌ«Grave Blood Oficial V5»Ì.scx

DISFRUNTELO Y QUE TENGAN UN BUEN DIA

DESCARGAR

HACER GRAFICA DE PASTEL CON PHP Y MYSQL

Hola amigos ya hemos podido guardar, modificar, eliminar y presentar datos de una base de datos por medio de HTML, PHP5 Y MySQL, pero ahora falta ver como hemos de presentar los datos gráficamente de manera que nos o les sea útil a nosotros o al encargado de cierto departamento y pueda tomar las decisiones correcta en base a la visualización de los datos que presentaremos, ahora les mostrare el código fuente con el cual podrán utilizar los datos de su tabla para generar graficas.

Primero les dejo el archivo de consultas.php que esta dentro de la carpeta modelo

<?php


//FUNCION PARA OBTERNER EL NUMERO TOTAL DE EGRESADOS TRABAJANDO

function egresadosTrabajando(){


    $enlace = mysql_connect("localhost", "root", "");

    mysql_select_db("sce", $enlace);


    $alumnosTrabando = "SELECT * FROM vmlzj_comprofiler WHERE cb_empleado='si'";

    $resultado = mysql_query($alumnosTrabando,$enlace);


    $numeroFilas = mysql_num_rows($resultado);


    return $numeroFilas;

}


//FUNCION PARA OBTENER DE LA TABLA EL NUMERO TOTAL DE EGRESADOS DESEMPLEADOS

function egresadosDesempleados(){


    $enlace = mysql_connect("localhost", "root", "");

    mysql_select_db("sce", $enlace);


    $alumnosTrabando = "SELECT * FROM vmlzj_comprofiler WHERE cb_empleado='no'";

    $resultado = mysql_query($alumnosTrabando,$enlace);


    $numeroFilas = mysql_num_rows($resultado);


    return $numeroFilas;

}


?>

Ahora les dejo el código que hace que pinte la grafica gAlumT.php

 

<?php

//MANDAMOS A LLAMAR LAS LIBRERIAS JPGRAPH

include ("jpgraph/jpgraph.php");

include ("jpgraph/jpgraph_pie.php");

include ("jpgraph/jpgraph_pie3d.php");


//MANDAMOS LLAMAR LA LIBRERIA PARA USAR LAS FUNCIONES QUE NOS DARAN LOS DATOS

include ("modelo/consultas.php");


//USAMOS LAS FUNCIONES PARA ASIGNAR LOS VALORES

$egreT = egresadosTrabajando();

$egreD = egresadosDesempleados();


//AQUI VAN LOS DATOS ASIGNADOS

$data = array($egreT,$egreD);



$graph = new PieGraph(450,200,"auto");

$graph->img->SetAntiAliasing();

$graph->SetMarginColor('gray');

//$graph->SetShadow(); 


// Setup margin and titles 

$graph->title->Set("Grafica de alumnos trabajando");


$p1 = new PiePlot3D($data);

$p1->SetSize(0.35);

$p1->SetCenter(0.5);


// Setup slice labels and move them into the plot 

$p1->value->SetFont(FF_FONT1,FS_BOLD);

$p1->value->SetColor("black");

$p1->SetLabelPos(0.2);


$nombres=array("Egresados con trabajo","Egresados sin trabajo");

$p1->SetLegends($nombres);


// Explode all slices 

$p1->ExplodeAll();


$graph->Add($p1);

$graph->Stroke();

?>

 

Les dejo la librería de JPGRAPH para que la puedan descargar, SALUDOS espero que les halla servidor

4c88e-descargar-button

Validación de sistemas críticos

Actividad 1:

Validación

1. ¿Describe las razones por las cuales es necesaria la validación?

a. Costes de fallos de ejecución. Los costes y las consecuencias de los fallos de ejecución de los sistemas críticos son potencial mente mucho más grandes que para los sistemas no críticos. Pueden reducirse los riesgos de los fallos del sistema invirtiendo más en verificación y validación del sistema. Normalmente es más económico encontrar y eliminar defectos antes de que el sistema sea entregado que pagar por los consecuentes costes de accidentes o de un mal funcionamiento de los servicios del sistema.

b. Validación de los atributos de confiabilidad. Puede tenerse que hacer una demostración formal a los clientes de que el sistema satisface sus requerimientos especificados de confiabilidad (disponibilidad, fiabilidad, seguridad y protección). Para evaluar estas características de confiabilidad se requieren actividades específicas de V & V explicadas más adelante en este capítulo. En algunos casos, los reguladores externos, tales como autoridades de aviación nacionales, pueden tener que certificar que el sistema es seguro antes de que éste sea desplegado. Para obtener esta certificación, pueden tenerse que diseñar y llevar a cabo procedimientos de V & V especiales que recogen la evidencia sobre la confiabilidad del sistema.

2. Cuál es el proceso para medir la fiabilidad de un software

Pruebas estadísticas

a. Se comienza estudiando los sistemas existentes del mismo tipo para establecer un per- fil operacional. Un perfil operacional identifica las clases de entradas al sistema y la probabilidad de que estas entradas ocurran en un uso normal.

b. A continuación, se construye un conjunto de datos de prueba que reflejan el perfil operacional. Esto significa que se crean datos de prueba con la misma distribución de probabilidad que los datos de prueba para los sistemas que se han estudiado. Normalmente, se utiliza un generador de datos de prueba para soportar este proceso.

c. Se prueba el sistema utilizando estos datos y se contabiliza el número y tipo de fallos que ocurren. Los instantes en los que ocurren estos fallos también son registrados. Tal y como se indicó en el Capítulo 9, las unidades de tiempo que se elijan deberían ser adecuadas para la métrica de fiabilidad utilizada.

d. Después de que se ha observado un número de fallos significativos estadísticamente, se puede calcular la fiabilidad del software y obtener el valor adecuado de la métrica de fiabilidad.

3. Que es y porque es importante un perfil de operaciones

Consiste en la especificación de clases de entradas y la probabilidad de su ocurrencia. Cuando un nuevo sistema software reemplaza a un sistema existente manual o automatizado, es razonablemente fácil evaluar el patrón de uso probable del nuevo software. Éste debería corresponderse con el uso del sistema existente, con algunas adiciones para las nuevas funcionalidades que (presumiblemente) se incluyen en el nuevo software. Por ejemplo, puede especificarse un perfil operacional para sistemas de centralitas de telecomunicaciones debido a que las compañías de telecomunicaciones conocen los patrones de llamadas que estos sistemas tienen que manejar.

El perfil operacional del software es importante por que refleja cómo se utilizará éste en la práctica.

4. La dificultad para la construcción de un perfil operacional de un software nuevo ¿Es igual para uno que se creó para remplazar a otro?

NO por que cuando un sistema software es nuevo e innovador, es difícil anticipar cómo será utilizado y, por lo tanto, generar un perfil operacional preciso.

5. Cómo funciona el modelo de crecimiento de fiabilidad

Un modelo de crecimiento de fiabilidad es un modelo de cómo cambia la fiabilidad del sistema a lo largo del tiempo durante el proceso de pruebas. Para predecir la fiabilidad, el modelo conceptual de crecimiento de la fiabilidad debe ser traducido a un modelo matemático.

Aquí no se entra en este nivel de detalle, sino que simplemente se plantea el principio del crecimiento de la fiabilidad.

6. ¿Es garantía de que la fiabilidad mejorara en cada entrega después de corregir fallos? ¿Por qué?

SI, por que a medida que se descubren los fallos del sistema, los defectos subyacentes que provocan estos fallos son reparados para que la fiabilidad del sistema mejore durante las pruebas y depuración.

Aunque los defectos del software no siempre se reparan durante la depuración, y cuando se cambia un programa, a menudo se introducen nuevos defectos. La probabilidad de ocurrencia de estos defectos puede ser mayor que la probabilidad de ocurrencia del defecto que ha sido reparado. Por lo tanto, la fiabilidad del sistema a veces puede empeorar en una nueva entrega en lugar de mejorar.

Por lo tanto no es garantía

7. ¿Hasta cuando las pruebas y depuración deben continuar?

Las pruebas pueden detenerse cuando se alcance el nivel requerido de fiabilidad del sistema.

8. Ventajas de la predicción de la predicción a partir de un modelo

Planificación de las pruebas. Dado el calendario actual de pruebas, puede predecirse cuándo se completarán las pruebas. Si el final de las pruebas tiene lugar después de la fecha planificada de entrega del sistema, entonces puede tenerse que desplegar recursos adicionales para probar y depurar, y así acelerar la tasa de crecimiento de fiabilidad.

Negociaciones con el cliente. Algunas veces el modelo de fiabilidad muestra que el crecimiento de la fiabilidad es muy lento y que se requiere una cantidad de esfuerzo de pruebas desproporcionada para obtener un beneficio relativamente pequeño.

Puede merecer la pena renegociar los requerimientos de fiabilidad con el cliente. De forma alternativa, puede ocurrir que el modelo prediga que la fiabilidad requerida probablemente nunca será alcanzada. En este caso, se tendrán que renegociar con el cliente los requerimientos de la fiabilidad del sistema.

9. Tipos de revisiones propuestas por el autor para ser obligatorias y garantizar la seguridad de un sistema

1. revisión para corregir la función que se pretende;

2. revisión para una estructura comprensible y mantenible;

3. revisión para verificar que el algoritmo y el diseño de las estructuras de datos son consistentes con el comportamiento especificado;

4. revisión de la consistencia del código y del diseño del algoritmo y de las estructuras de datos;

5. revisión de la adecuación de los casos de prueba del sistema

10. En qué consiste la técnica más efectiva para demostrar la seguridad del sistema (contradicción)

La técnica más efectiva para demostrar la seguridad de un sistema es la demostración por contradicción. Se comienza suponiendo que se está en un estado no seguro, el cual ha sido identificado por un análisis de contingencias del sistema, y que puede ser alcanzado ejecutando el programa. Se describe un predicado que define este estado no seguro.

A continuación, se analiza el código de forma sistemática y se muestra que, para todos los caminos del programa que conducen a ese estado, la condición de terminación de estos caminos contradice el predicado no seguro.

Si éste es el caso, la suposición inicial de un estado inseguro es incorrecta.

Si se repite esto para todas las contingencias identificadas, entonces el software es seguro.

a. Ejemplo:

Como ejemplo, consideremos el código de la Figura 24.6, que podría ser parte de la implementación del sistema de suministro de insulina. Desarrollar un argumento de seguridad para este código implica demostrar que la dosis de insulina administrada nunca es mayor que algún nivel máximo establecido para cada individuo diabético. Por lo tanto, no es necesario probar que el sistema suministra la dosis correcta, sino simplemente que nunca suministra una sobredosis al paciente.

Para construir un argumento de seguridad, se identifica la precondición para el estado in- seguro que, en este caso, es que currentDose > maxDose. Después se demuestra que todos los caminos del programa conducen a una contradicción de esta aserción no segura. Si éste es el caso, la condición no segura no puede ser cierta. Por lo tanto, el sistema es seguro. Se pueden estructurar y presentar los argumentos de seguridad de forma gráfica tal y como se muestra en la Figura 24.7. Los argumentos de seguridad, según se refleja en la citada figura, son mucho más cortos que las verificaciones formales de sistemas. Primero se identifica todos los posibles caminos que conducen a! estado potencial mente inseguro. Se trabaja hacia atrás a partir de este estado no seguro y se considera la última asignación de todas las variables de estado en cada camino que conduce a él. Pueden omitirse los cálculos previos (como la sentencia if 1 en la Fi- gura 24.7) en el argumento de seguridad. En este ejemplo, todo lo que se necesita saber es el conjunto de posibles valores de currentDose inmediatamente antes de que el método administerlnsulin sea ejecutado. En el argumento de seguridad mostrado en la Figura 24.7, existen tres posibles caminos en el programa que conducen a la llamada al método administerlnsulin. Queremos demostrar que la cantidad de insulina suministrada nunca excede del valor de maxDose. Se consideran todos los posibles caminos hasta administerlnsulin:

Fuente: ingeniería del software lan Sommenville

Haciendo una bitácora para una aplicación Web con CodeIgniter

Se preguntarán para que sirve una bitácora en en una Aplicación Web. Bueno les diré, es muy útil, ya que va guardando los movimientos de los usuarios y en  caso de reclamo por parte de los usuarios de que el sistema que hemos desarrollado no funciona por que han perdido datos pero en realidad ellos los borraron por razones privadas, nosotros podremos defendernos con esta bitácora de movimientos que dirá a que hora se realizo cierta acción y quien la realizo ejemplo:

image

Como pueden ver se puede visualizar la acción realizada, el usuario al que se le hizo el cambio luego al usuario que realizo

el cambio, la fecha y hora en que se realizo la acción y valor anterior y el valor nuevo

A continuación les mostrare parte del código

Vista de la bitácora “bitacora.php”

<?php

function estado($edo){

    if($edo==1){

        return "Administrador";

        }

    else {

        return "Usuario";

    }

    }

 

$eliminar = base_url()."imagenes/eliminar.fw.png";

$actualizar = base_url()."imagenes/modificar.png";

    

function estadoImg($edo){

    $palomita = base_url()."imagenes/v.fw.png";

    $x = base_url()."imagenes/eliminar.png";

    if($edo==1){

        return "<img src=".$palomita.">";

    }

    else{

        return "<img src=".$x.">";

    }

}

 

 

 

?>

        <script type="text/javascript">

        <!--

        

        function confirmacion(id) {

        var answer = confirm("Esta seguro que desea eliminar")

        if (answer){

        alert("Ha confirmado eliminar")

        location.href="deleteUserId/"+id

        }

        else{

        alert("Cancelado")

        }

    }

    

    function actualizar(id) {

        

        location.href="updateUserId/"+id

        

    }

//-->


 


        <?php echo $_SESSION['nombre'];?>

        

        

        

Bitacora

    

<div id="container">

 

    <div id="body" align="center">

        

         

            <table border="0" align="center">

            

            <form id="b" name="b" action="index.php/welcome/buscarBitacora" method="POST">

            <label for="buscar">Buscar 

            <input type= "text" id="buscar" name="buscar" >

            

            <input type="submit" id="arre" name="arre" value="buscar"

            

            

            

            

            <table border="0" align="center" id="tabla">

            <tr bgcolor="#7362ec" align="center">

            

            Acción

            Usuario administrado 

            Usuario administrador  

            Fecha

            Valor Anterior

            Valor nuevo

            

            

            

    

        

            <?php

            $colorfila=0;

            

            

            if($users!=false){

               foreach($users->result() as $row){

                   if ($colorfila==0){ 

                   $color= "#b5b5b5"; 

                   $colorfila=1; 

                    }else{ 

                   $color="#f7f7f7"; 

                   $colorfila=0; 

                }    

                

                

                echo "<tr bgcolor='".$color."' align='center' ";?> onmouseover="this.style.backgroundColor='#E13300'"

                                                                   onmouseout="this.style.backgroundColor=''"><?php

                

                echo " ".$row->accion."";

                echo "".$row->UsuarioAdministrado. "";

                echo " ".$row->usuarioAdministrador."";

                echo "".$row->fecha."";

                echo "".$row->valor_anterior."";

                echo "".$row->valor_nuevo."";

                

                

                echo "";

            }

            

        }

        ?>

        

        

        

 

    

 

 

 


La parte del controlador “users.php”

//FUNCION GUARDAR BITACORA

        public function guardarBitacora($id,$accion){

            if(isset($_SESSION['usuario'])){

                

                $datoAnterior="";

                $datoNuevo="";

                //Obteniendo los datos que se van a modificar

                $nom_usu = $this->input->post('nom_usu');

                

                $clave=sha1($this->input->post('psw'));

    

                $login = $this->input->post('login');

                $status = $this->input->post('status');

                $acceso = $this->input->post('acceso');

                $local = $this->input->post('local');

                $ld_nacional = $this->input->post('ld_nacional');

                $cel_ld = $this->input->post('cel_ld');

                $cel_local = $this->input->post('cel_local');

                $internacional = $this->input->post('internacional');

                

                $br="
"
;

                

                //Obterner los datos de la la base de datos

                $datosDB=$this->usersModel->datosUsuario($id);

                

                //Comparando login

                if($login==@$datosDB->login){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.="login:".$datosDB->login;

                    $datoNuevo.="login:".$login;

                    }

                    

                    

                //Comparando nombre de usuario    

                if($nom_usu==$datosDB->nom_usu){

                        $datoAnterior.= "";

                    }

                else{

                    $datoAnterior.=$br."nom_usu:".$datosDB->nom_usu;

                    $datoNuevo.=$br."login:".$nom_usu;

                    }

                    

                //Comparando nombre de password    

                if($clave==$datosDB->psw){

                        $datoAnterior.= "";

                    }

                else{

                    $datoAnterior.=$br."psw:***";

                    $datoNuevo.=$br."login:???";

                    }

                    

                //Comparando status    

                if($status==$datosDB->status){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."status:".$datosDB->status;

                    $datoNuevo.=$br."status:".$status;

                    }

                

                

                

                //Comparando acceso    

                if($acceso==$datosDB->acceso){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."acceso:".$datosDB->acceso;

                    $datoNuevo.=$br."acceso:".$acceso;

                    }

                

                

                

                //Comparando llamadas locales    

                if($local==$datosDB->local){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."local:".$datosDB->local;

                    $datoNuevo.=$br."local:".$local;

                    }

                

                

                

                //Comparando llamadas nacionales    

                if($ld_nacional==$datosDB->ld_nacional){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."ld_nacional:".$datosDB->ld_nacional;

                    $datoNuevo.=$br."ld_nacional:".$ld_nacional;

                    }

                

                

                

                //Comparando llamadas cel_ld    

                if($cel_ld==$datosDB->cel_ld){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."cel_ld:".$datosDB->cel_ld;

                    $datoNuevo.=$br."cel_ld:".$cel_ld;

                    }

                

                

                

                //Comparando llamadas cel_local    

                if($cel_local==$datosDB->cel_local){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."cel_local:".$datosDB->cel_local;

                    $datoNuevo.=$br."cel_local:".$cel_local;

                    }

                

                

                

                if($internacional==$datosDB->internacional){

                        $datoAnterior.="";

                    }

                else{

                    $datoAnterior.=$br."Internacional:".$datosDB->internacional;

                    $datoNuevo.=$br."internacional:".$internacional;

                    }

                

                

                

            $dataBit = array(

                            "accion" => $accion,

                            "usuarioAdministrador" => $_SESSION["login"],

                            "usuarioAdministrado" => $login,

                            "valor_anterior" => $datoAnterior,

                            "valor_nuevo" => $datoNuevo

                            );

            $this->usersModel->insertBitacora($dataBit);

        

        }

        }

Ahora la parte del modelo “usersmodels”

public function getBitacora(){

    

        $data=$this->db->get('vistabitacora');

            

        if($data->num_rows() >0){

            return $data;

        }else{

            return false;

            }

    }

 

    public function insertBitacora($data){

        $this->db->insert('bitacora',$data);

        

    }

 

function buscarBitacora($dato){

        

        $this->db->select('accion');

        $this->db->select('usuarioAdministrador');

        $this->db->select('UsuarioAdministrado');

        $this->db->select('valor_anterior');

        $this->db->select('valor_nuevo');

        $this->db->select('fecha');

        

        $this->db->like('usuarioAdministrador',$dato);

        $this->db->or_like('accion',$dato);

        $this->db->or_like('usuarioAdministrado',$dato);

        $this->db->or_like('valor_anterior',$dato);

        $this->db->or_like('valor_nuevo',$dato);

        $this->db->or_like('fecha',$dato);

        

        

        

        $consul=$this->db->get('bitacora');

    

        if($consul->num_rows() >0){

        return $consul;

        }else{

            return false;

        }    

    }    

 

Archivo SQL

# SQL Manager 2010 for MySQL 4.5.1.3

# ---------------------------------------

# Host     : localhost

# Port     : 3306

# Database : asteriskcdrdb

 

 

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;

/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;

/*!40101 SET NAMES latin1 */;

 

SET FOREIGN_KEY_CHECKS=0;

 

CREATE DATABASE `asteriskcdrdb`

    CHARACTER SET 'latin1'

    COLLATE 'latin1_swedish_ci';

 

USE `asteriskcdrdb`;

 

#

# Structure for the `bitacora` table : 

#

 

CREATE TABLE `bitacora` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `accion` varchar(20) DEFAULT NULL,

  `usuarioAdministrador` varchar(20) DEFAULT NULL,

  `usuarioAdministrado` varchar(20) CHARACTER SET latin1 COLLATE latin1_spanish_ci NOT NULL,

  `valor_anterior` varchar(200) DEFAULT NULL,

  `valor_nuevo` varchar(200) DEFAULT NULL,

  `fecha` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=48 DEFAULT CHARSET=latin1 COMMENT='id-int(11)naccion-varchar(20)nusuario-varchar(20)nfecha-datenhora-timenvalor_anterior-varchar(20)nvalor_nuevo-varchar(20)';

 

#

# Structure for the `cdr` table : 

#

 

CREATE TABLE `cdr` (

  `calldate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',

  `clid` varchar(80) NOT NULL DEFAULT '',

  `src` varchar(80) NOT NULL DEFAULT '',

  `dst` varchar(80) NOT NULL DEFAULT '',

  `dcontext` varchar(80) NOT NULL DEFAULT '',

  `channel` varchar(80) NOT NULL DEFAULT '',

  `dstchannel` varchar(80) NOT NULL DEFAULT '',

  `lastapp` varchar(80) NOT NULL DEFAULT '',

  `lastdata` varchar(80) NOT NULL DEFAULT '',

  `duration` int(11) NOT NULL DEFAULT '0',

  `billsec` int(11) NOT NULL DEFAULT '0',

  `disposition` varchar(45) NOT NULL DEFAULT '',

  `amaflags` int(11) NOT NULL DEFAULT '0',

  `accountcode` varchar(20) NOT NULL DEFAULT '',

  `uniqueid` varchar(32) NOT NULL DEFAULT '',

  `userfield` varchar(255) NOT NULL DEFAULT '',

  KEY `IDX_UNIQUEID` (`uniqueid`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

#

# Structure for the `user_control` table : 

#

 

CREATE TABLE `user_control` (

  `id_usu` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,

  `status` int(1) unsigned NOT NULL DEFAULT '1',

  `nom_usu` varchar(25) NOT NULL,

  `login` varchar(4) NOT NULL DEFAULT '0000',

  `psw` varchar(40) CHARACTER SET latin1 COLLATE latin1_spanish_ci NOT NULL,

  `local` tinyint(4) NOT NULL DEFAULT '0',

  `ld_nacional` tinyint(4) NOT NULL DEFAULT '0',

  `cel_local` tinyint(4) NOT NULL DEFAULT '0',

  `cel_ld` tinyint(4) NOT NULL DEFAULT '0',

  `internacional` tinyint(4) NOT NULL DEFAULT '0',

  `acceso` tinyint(4) NOT NULL DEFAULT '0',

  PRIMARY KEY (`id_usu`),

  UNIQUE KEY `login` (`login`)

) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8;

 

#

# Structure for the `usuarios` table : 

#

 

CREATE TABLE `usuarios` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `username` varchar(20) DEFAULT NULL,

  `password` varchar(20) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

#

# Data for the `bitacora` table  (LIMIT 0,500)

#

 

INSERT INTO `bitacora` (`id`, `accion`, `usuarioAdministrador`, `usuarioAdministrado`, `valor_anterior`, `valor_nuevo`, `fecha`) VALUES 

  (1,'CerrarSesion','45','',NULL,NULL,'2012-11-02 19:06:35'),

  (2,'Acceso','00','',NULL,NULL,'2012-11-02 19:09:07'),

  (3,'Actualización','00','00','
acceso:1'
,'
acceso:0'
,'2012-11-02 19:09:41'),

  (4,'CerrarSesion','00','',NULL,NULL,'2012-11-02 19:09:45'),

  (5,'Acceso','00','',NULL,NULL,'2012-11-02 19:09:52'),

  (6,'CerrarSesion','00','',NULL,NULL,'2012-11-02 19:12:31'),

  (7,'Acceso','00','',NULL,NULL,'2012-11-02 19:12:40'),

  (8,'CerrarSesion','00','',NULL,NULL,'2012-11-02 19:13:27'),

  (9,'Acceso','00','',NULL,NULL,'2012-11-02 19:13:34'),

  (10,'Acceso','05','',NULL,NULL,'2012-11-05 09:33:09'),

  (11,'CerrarSesion','05','',NULL,NULL,'2012-11-05 09:37:14'),

  (12,'Acceso','05','',NULL,NULL,'2012-11-05 09:38:30'),

  (13,'Actualización','05','0','login:05
nom_usu:Julio Cesar
status:1
acceso:1
local:1'
,'login:
login:
status:
acceso:
local:'
,'2012-11-06 16:51:42'),

  (14,'Cambio de contraseña','05','',NULL,NULL,'2012-11-06 16:55:18'),

  (15,'CerrarSesion','05','',NULL,NULL,'2012-11-06 16:55:24'),

  (16,'Acceso','00','',NULL,NULL,'2012-11-06 16:58:49'),

  (17,'Actualización','00','05','','','2012-11-06 16:59:29'),

  (18,'Actualización','00','05','
psw:***
local:0'
,'
login:???
local:1'
,'2012-11-06 17:01:56'),

  (19,'Actualización','00','05','
local:0'
,'
local:1'
,'2012-11-06 17:03:18'),

  (20,'CerrarSesion','00','',NULL,NULL,'2012-11-06 17:03:29'),

  (21,'Acceso','05','',NULL,NULL,'2012-11-06 17:03:34'),

  (22,'Cambio de contraseña','05','',NULL,NULL,'2012-11-06 17:03:49'),

  (23,'CerrarSesion','05','',NULL,NULL,'2012-11-06 17:03:54'),

  (24,'Acceso','05','',NULL,NULL,'2012-11-06 17:04:01'),

  (25,'Acceso','05','',NULL,NULL,'2012-11-07 07:00:08'),

  (26,'Registro','05','10','login:
nom_usu:
psw:***
status:
acceso:
local:'
,'login:10
login:Chicho
login:???
status:1
acceso:0
local:1'
,'2012-11-07 07:01:00'),

  (27,'Registro','05','0','
psw:***'
,'
login:???'
,'2012-11-07 07:03:42'),

  (28,'Cambio de contraseña','05','',NULL,NULL,'2012-11-07 07:05:35'),

  (29,'Cambio de contraseña','05','43',NULL,NULL,'2012-11-07 07:08:16'),

  (30,'CerrarSesion','05','',NULL,NULL,'2012-11-07 07:13:31'),

  (31,'Acceso','05','',NULL,NULL,'2012-11-07 07:17:14'),

  (32,'Eliminacion','05','40','id_usu:40
nom_usu:Felipe
acceso:1
status:1
local:0
ld_nacional:0
cel_local:0
cel_ld:0
intenacional:0'
,NULL,'2012-11-07 07:17:59'),

  (33,'Actualización','05','01','login:05
psw:***
acceso:1
local:0'
,'login:01
login:???
acceso:0
local:1'
,'2012-11-07 07:23:14'),

  (34,'Actualización','05','11','login:01
local:0'
,'login:11
local:1'
,'2012-11-07 07:23:57'),

  (35,'Actualización','05','01','
psw:***
local:0'
,'
login:???
local:1'
,'2012-11-07 07:26:04'),

  (36,'Registro','05','21',NULL,NULL,'2012-11-07 07:41:53'),

  (37,'CerrarSesion','05','',NULL,NULL,'2012-11-07 07:42:07'),

  (38,'Acceso','21','',NULL,NULL,'2012-11-07 07:42:16'),

  (39,'Cambio de contraseña','21','',NULL,NULL,'2012-11-07 07:42:36'),

  (40,'CerrarSesion','21','',NULL,NULL,'2012-11-07 07:42:48'),

  (41,'Acceso','21','',NULL,NULL,'2012-11-07 07:42:56'),

  (42,'CerrarSesion','21','',NULL,NULL,'2012-11-07 07:43:35'),

  (43,'Acceso','10','',NULL,NULL,'2012-11-10 17:13:47'),

  (44,'CerrarSesion','10','',NULL,NULL,'2012-11-10 17:13:55'),

  (45,'Acceso','06','',NULL,NULL,'2012-11-10 17:15:15'),

  (46,'CerrarSesion','06','',NULL,NULL,'2012-11-10 17:16:21'),

  (47,'Acceso','06','',NULL,NULL,'2012-11-10 17:16:32');

COMMIT;

 

#

# Data for the `cdr` table  (LIMIT 0,500)

#

 

INSERT INTO `cdr` (`calldate`, `clid`, `src`, `dst`, `dcontext`, `channel`, `dstchannel`, `lastapp`, `lastdata`, `duration`, `billsec`, `disposition`, `amaflags`, `accountcode`, `uniqueid`, `userfield`) VALUES 

  ('2012-09-03 19:52:50','"Julian Garibaldi" ','100','100','from-internal','SIP/100-00000000','SIP/100-00000001','Dial','SIP/100,"",tr',10,5,'ANSWERED',3,'','1346723570.0',''),

  ('2012-09-04 13:28:33','"Julian Garibaldi" ','100','100','from-internal','SIP/100-00000001','SIP/100-00000002','Congestion','10',5,0,'FAILED',3,'','1346786913.1',''),

  ('2012-09-04 13:29:08','"Julian Garibaldi" ','100','100','from-internal','SIP/100-00000004','SIP/100-00000005','Dial','SIP/100,"",tr',24,22,'ANSWERED',3,'','1346786948.4',''),

  ('2012-09-04 13:33:52','"Julian Garibaldi" ','100','100','from-internal','SIP/100-00000006','SIP/100-00000007','Congestion','10',5,0,'FAILED',3,'','1346787232.6',''),

  ('2012-09-04 13:35:36','"Julian Garibaldi" ','100','100','from-internal','SIP/100-0000000d','SIP/100-0000000e','Dial','SIP/100,"",tr',16,8,'ANSWERED',3,'','1346787336.13',''),

  ('2012-09-04 14:13:33','"Recepcion" ','300','300','personalizado','SIP/300-0000000f','SIP/300-00000010','Hangup','',30,0,'NO ANSWER',3,'','1346789613.15',''),

  ('2012-09-04 14:14:08','"Recepcion" ','300','300','personalizado','SIP/300-00000011','SIP/300-00000012','Dial','SIP/300,30,Tt',28,25,'ANSWERED',3,'','1346789648.17',''),

  ('2012-09-04 14:18:24','"Recepcion" ','300','300','personalizado','SIP/300-00000013','SIP/300-00000014','Dial','SIP/300,30,Tt',4,0,'NO ANSWER',3,'','1346789904.19','');

COMMIT;

 

#

# Data for the `user_control` table  (LIMIT 0,500)

#

 

INSERT INTO `user_control` (`id_usu`, `status`, `nom_usu`, `login`, `psw`, `local`, `ld_nacional`, `cel_local`, `cel_ld`, `internacional`, `acceso`) VALUES 

  (36,0,'kakaroto','45','da39a3ee5e6b4b0d3255bfef95601890afd80709',0,0,1,1,0,0),

  (38,1,'Julio Cesar','01','7c4a8d09ca3762af61e59520943dc26494f8941b',0,0,0,0,0,0),

  (39,1,'Julian Garibaldi','06','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',0,1,1,1,1,1),

  (41,1,'Chicho','10','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',1,0,0,0,0,0),

  (42,0,'0','0','da39a3ee5e6b4b0d3255bfef95601890afd80709',0,0,0,0,0,0),

  (43,1,'diane','11','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',1,0,0,0,0,0),

  (45,1,'Mijail','43','4f62e47bd66b5ab1a8fa1e9508d53ae78e7dcfac',1,0,0,0,0,0),

  (46,1,'xyz','21','dd5fef9c1c1da1394d6d34b248c51be2ad740840',1,0,0,0,0,0);

COMMIT;

 

 

 

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 

¿Qué es y cómo opera un ataque de Cross-Site Scripting (XSS)?

Definición

XSS es un ataque de inyección de código malicioso para su posterior ejecución que puede realizarse a sitios web, aplicaciones locales e incluso al propio navegador.

Sucede cuando un usuario mal intencionado envía código malicioso a la aplicación web y se coloca en forma de un hipervínculo para conducir al usuario a otro sitio web, mensajería instantánea o un correo electrónico. Así mismo, puede provocar una negación de servicio (DDos).

 

clip_image002
Fig. 1. Operación de un ataque XSS

Generalmente, si el código malicioso se encuentra en forma de hipervínculo es codificado en HEX (basado en el sistema de numeración hexadecimal, base 16) o algún otro, así cuando el usuario lo vea, no le parecerá sospechoso. De esta manera, los datos ingresados por el usuario son enviados a otro sitio, cuya pantalla es muy similar al sitio web original.

De esta manera, es posible secuestrar una sesión, robar cookies y cambiar la configuración de una cuenta de usuario.

Tipos de ataques

Las diversas variantes de esta vulnerabilidad pueden dividirse en dos grandes grupos: el primero se conoce como XSS persistente o directo y el segundo como XSS reflejado o indirecto.

Directo o persistente. Consiste en invadir código HTML mediante la inclusión de etiquetas y en sitios que lo permiten.

Local. Es una de las variantes del XSS directo, uno de sus objetivos consiste en explotar las vulnerabilidades del mismo código fuente o página web. Esas vulnerabilidades son resultado del uso indebido del DOM (Modelo de Objetos del Documento, es un conjunto estandarizado de objetos para representar páginas web) con JavaScript, lo cual permite abrir otra página web con código malicioso JavaScript incrustado, afectando el código de la primera página en el sistema local. Cuando el XSS es local, ningún código malicioso es enviado al servidor. El funcionamiento toma lugar completamente en la máquina del cliente, pero modifica la página proporcionada por el sitio web antes de que sea interpretada por el navegador para que se comporte como si se realizara la carga maliciosa en el cliente desde el servidor. Esto significa que la protección del lado del servidor que filtra el código malicioso no funciona en este tipo de vulnerabilidad.

Indirecto o reflejado. Funciona modificando valores que la aplicación web pasa de una página a otra, sin emplear sesiones. Sucede cuando se envía un mensaje o ruta en una URL, una cookie o en la cabecera HTTP (pudiendo extenderse al DOM del navegador).

Consideraciones

Como desarrollador

La aplicación web que se desee implementar debe contar con un buen diseño. Posteriormente, se deben realizar diversos tipos de pruebas antes de su liberación, para detectar posibles fallos y  huecos de seguridad, mediante el empleo de alguna herramienta automatizada. También, es conveniente proporcionar mantenimiento a la aplicación y estar actualizado en las versiones de las herramientas que se emplean para su puesta en marcha.

Algunas recomendaciones para mitigar el problema, son:

Emplear librerías verificadas o algún framework que ayude a disminuir el inconveniente. Por ejemplo: la librería anti-XSS de Microsoft, el módulo ESAPI de codificación de OWASP, Apache Wicket, entre otros.

Entender el contexto en el cual los datos serán usados y la codificación de los mismos, este aspecto es importante cuando se envían datos de un componente a otro de la aplicación o cuando se deben enviar a otra aplicación.

Conocer todas las áreas potenciales donde las entradas no verificadas pueden acceder al software: parámetros o argumentos, cookies, información de la red, variables de entorno, resultados de consultas, búsqueda de DNS reversible, peticiones enviadas en las cabeceras, componentes de la URL, correos electrónicos, archivos, nombres de archivo, bases de datos o algún sistema externo que proporcione información a la aplicación.

Las validaciones de datos de entrada, deben realizarse siempre del lado del servidor, no sólo en el lado del cliente. Los atacantes pueden evitar la validación realizada del lado del cliente modificando valores antes de realizar verificaciones o remover por completo esta validación.

En caso de ser posible, emplear mecanismos automatizados para separar cuidadosamente los datos del código fuente: revisión de comillas, codificación y validación automática que muchas veces se escapan al desarrollador.

Por cada página web generada, se recomienda emplear una codificación determinada de caracteres, ya que si no se especifica, el navegador puede dar un trato diferente a ciertas secuencias de caracteres especiales, permitiendo la apertura del cliente a posibles ataques.

Para mitigar el problema de ataque contra el uso de cookies, es conveniente indicar que tiene el formato de HttpOnly. En los navegadores que lo soportan, puede prevenirse que la cookie sea usada por scripts maliciosos desde el lado del cliente.

Se debe emplear una estrategia de validación de las entradas: rechazar aquellas que no cumplan con lo especificado, limpiar las que sean necesarias. Al validar, considérense  las características de cada entrada: longitud, tipo de dato, rango de valores aceptados, entradas perdidas o adicionales, sintaxis, consistencia con otras entradas proporcionadas y seguimiento de las reglas del negocio.

Cuando se construyan páginas web de forma dinámica (generadas de acuerdo a las entradas o solicitudes de los usuarios), es recomendable usar listas blancas estrictas. Todas las entradas deben ser limpiadas y validadas, incluidos cookies, campos ocultos, cabeceras y la propia dirección.

Cuando una cantidad aceptable de objetos, como nombres de archivo o URL es limitada o conocida, es conveniente crear una conjunto de asignaciones de valores de entrada fijo a los nombres de archivo o URL y rechazar todos los demás.

Se recomienda usar un firewall de aplicaciones capaz de detectar ataques cuando el código se genere dinámicamente, como medida de prevención, debe complementarse con otras para proporcionar defensa en profundidad.

Como Administrador de Bases de Datos

Así como el desarrollador debe validar las entradas proporcionadas por parte del usuario, el encargado de diseñar e implementar la base de datos debe considerar la seguridad de la misma, pues en ella se guarda la información proporcionada por los usuarios y es manipulada mediante la aplicación web. Los datos que serán almacenados, también pueden ser validados mediante el uso de constraints  (restricciones aplicables a los objetos de una base de datos: unique, default, not null, check) que restringen la entrada para cada campo.

PDF XSS

Es una vulnerabilidad ampliamente usada para afectar el Acrobat Reader de Adobe. En este caso, si se abusa de las características para abrir archivos en Acrobat, un sitio bien protegido se vuelve vulnerable a un ataque de tipo XSS si da alojamiento a documentos en formato PDF.

Esto afecta seriamente, a menos que se actualice el Reader o se cambie la forma en que el navegador maneja dichos documentos.

Una manera de combatirlo, si se cuenta con el servidor de aplicaciones web Apache, es llevar a cabo la correcta configuración de ModSecurity, ya que cuenta con directivas de protección para archivos en formato PDF.

XSRF

Un ataque Cross-Site Request Forgery (XSRF ó también CSRF) explota la confianza que un usuario tiene hacia las entradas proporcionadas por un sitio.

Por ejemplo: un usuario se encuentra autenticado y navegando en un sitio, en ese momento un atacante obtiene el control de su navegador, con él realiza una solicitud a una tarea de una URL válida del sitio, por lo que el atacante tendrá acceso como si fuera el usuario previamente registrado.

Distintivamente, un atacante intercalará código HTML o JavaScript malicioso en un correo o en una tarea específica accesible desde una URL, que se ejecuta ya sea directamente o empleando un error de tipo XSS. También, es posible realizar inyección a través de lenguajes como el BBCode. Este tipo de ataques son difíciles de detectar.

Muchas de las funcionalidades de un sitio web son susceptibles de uso durante un ataque XSRF. Esto incluye información enviada tanto por GET como por POST.

También puede usarse como vector para explotar vulnerabilidades de tipo XSS en una aplicación. Ejemplos de ello son: una vulnerabilidad de tipo XSS en un foro donde un atacante puede obligar al usuario a publicar –sin que éste se dé cuenta- un gusano informático. Un atacante puede también usar XSRF para transmitir un ataque a algún sitio de su elección, así como realizar un DDos.

Sin embargo, las formas más comunes de realizar este tipo de ataque consisten en usar la etiqueta HTML o el objeto JavaScript empleados para imágenes. Distintivamente, el atacante infiltrará un email o sitio web en ellos, así cuando el usuario cargue la página o el correo electrónico, también estará realizando la petición a la URL que haya colocado el atacante.

Un atacante puede instalar su script dentro de un documento de Word, un archivo de flash, un clip de video, redifusión web RSS o Atom, o algún otro tipo de formato que pueda alojar el script.

Si un sitio web permite ejecutar sus funciones empleando una URL estática o peticiones POST, es posible que sea vulnerable, si la función se lleva a cabo mediante la petición GET, el riesgo es mayor. Si se realizan las mismas funciones,  de la misma forma repetidamente, entonces la aplicación puede ser vulnerable.

Un ataque XSRF no puede evitarse mediante la verificación del referer de las cabeceras de la petición realizada, ya que puede “limpiarse” o modificarse mediante algún tipo de filtro. Las cabeceras pueden falsearse usando XMLHTTP, por ejemplo.

Una de las soluciones más conocidas, consiste en adjuntar un token no predecible y cambiante a cada petición. Es importante que el estado de éste vaya asociado con la sesión del usuario, de otra manera un atacante puede adjuntar su propio token válido y emplearlo en su beneficio. Adicionalmente, al ligarlo a la sesión del usuario es importante limitar el periodo durante el cual será válido.

Referencias.

Mesografía.

· http://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

· http://www.owasp.org/index.php/Testing_for_DOM-based_Cross_site_scripting_(OWASP-DV-003)

· http://www.modsecurity.org/projects/modsecurity/apache/feature_universal_pdf_xss.html

· http://www.cgisecurity.com/csrf-faq.html

· http://www.isecpartners.com/files/XSRF_Paper_0.pdf

· http://www.techrepublic.com/blog/security/what-is-cross-site-scripting/426

· http://cwe.mitre.org/data/definitions/79.html

Nueva herramienta contiene 150 formas de burlar firewalls de aplicaciones web

Una herramienta liberada dentro del Black Hat 2012 puede probar si firewalls de aplicaciones son vulnerables a técnicas de evasión de protocolos de capas.

clip_image001Una herramienta hecha para realizar pruebas de vulnerabilidad sobre firewalls de aplicaciones web (Web Application Firewalls, o WAFs), con cerca de 150 técnicas de evasión a nivel protocolo, fue liberada en la conferencia Black Hat USA 2012.

La herramienta y la investigación necesaria para su creación son el fruto de Ivan Ristic, director de ingeniería del proveedor de seguridad Qualys y autor original del popular firewall para web, ModSecurity.

Los firewalls para aplicaciones web son diseñados para proteger a las aplicaciones web de ataques conocidos, tal es el caso de ataques de inyección SQL, que son comúnmente utilizados para comprometer sitios web. Los WAFs logran esto mediante la intercepción de peticiones enviadas por los clientes, aplicando estrictas reglas sobre el formato y contenido de las mismas.

Sin embargo, existen varios métodos para que las peticiones maliciosas violen las reglas establecidas por los WAFs, al modificar ciertas partes de sus cabeceras o las rutas de los URLs solicitados. Estas se conocen como técnicas de evasión a nivel de protocolo, y los WAFs no están apropiadamente equipados para lidiar con ellas actualmente porque estas técnicas no están bien documentadas, comentó Ristic.

El investigador probó las técnicas de evasión encontradas primordialmente contra ModSecurity, un WAF de código abierto, pero es razonable asumir que otros WAFs son vulnerables a algunas de ellas igualmente.

De hecho, Ristic dijo que compartió algunas de las técnicas con otros durante la etapa de investigación, y que habían sido exitosas contra algunos productos WAF comerciales. 

Erwin Huber Dohner, jefe de investigación y desarrollo del fabricante suizo de WAF Ergon Informatik, confirmó después de ver la presentación de Ristic que los métodos de evasión son un problema para la industria. Ergon recientemente identificó algunas técnicas similares que funcionaron contra sus productos, las cuales ya han sido corregidas, comentó.

Al hacer pública su investigación, Ristic espera iniciar una discusión en la industria sobre evasión a nivel protocolo y de otros tipos. Un wiki también se ha configurado, con el propósito de construir un catálogo libremente disponible de técnicas de evasión contra WAFs.

Si los fabricantes e investigadores de seguridad no documentan sus problemas y los hacen públicos, los desarrolladores de WAFs continuarán cometiendo los mismos errores, dijo Ristic.

Además, la disponibilidad de la herramienta permite a los usuarios descubrir qué productos WAF son vulnerables, y posiblemente obligar a los fabricantes a corregirlos.

Cada fabricante tiene diferentes prioridades y normalmente no corrigen problemas hasta que existe un riesgo real para sus clientes, comentó Ristic. Dijo que espera que este proyecto de investigación genere el incentivo necesario para que comiencen a lidiar con estos problemas.

Dohner aprobó la iniciativa y cree que tanto los fabricantes como los usuarios de WAF se beneficiarán de ella.

Fuente: Techworld SB

Falta de compromiso en seguridad por parte de desarrolladores web

El proveedor de software Coverity ha liberado su reporte de riesgos de seguridad de software, el cual afirma que menos de dos quintas partes de compañías de desarrollo web se encargan de realizar pruebas durante el ciclo de desarrollo y que más de la mitad rechaza verificar sus códigos de fallos y vulnerabilidades de seguridad antes de las pruebas de integración.

 

clip_image002

 

De acuerdo al estudio, el resultado se traduce en más incidentes de seguridad en aplicaciones web y con más frecuencia, dando lugar a mayores costos generales.

La empresa especializada en el aseguramiento de calidad de software en EUA comisionó a la consultora Forrester llevar a cabo el estudio sobre la seguridad de las aplicaciones y pruebas. En julio, Forrester encuestó a 240 personas con grado de influencia que trabajan en empresas de desarrollo web de Europa y Norte América.

Mas del 70% de encuestados quienes habían experimentado previamente un incidente de seguridad se quejaron de una falta de tecnologías y procesos de seguridad para sus desarrolladores.

También hubo problemas con la escalabilidad y el presupuesto con una gran mayoría del 79% diciendo que no podían seguir el ritmo con volúmenes de código en aumento y más de dos terceras partes dicen que el financiamiento de la seguridad es insuficiente. 41% considera  que debido a un corto tiempo del lanzamiento al mercado se ven obligados a restar prioridad a la seguridad.

Unicamente el 42% cumplía con directrices de codificación segura y menos de un tercio contaba con una biblioteca de funciones autorizadas y prohibidas. Solo alrededor de una cuarta parte utilizó el modelado de amenazas durante el desarrollo.

Más de la mitad de los encuestados habían sufrido al menos una brecha de seguridad en los últimos 18 meses. El 18% había sufrido pérdidas de $500 mil dólares y un 8% sufrió pérdidas  de más de $1 millón de dólares.

La pobre integración con sus entornos de desarrollo, demasiada experiencia de seguridad requerida y un gran número de falsos positivos fueron citados como los tres más grandes desafíos al tratar con herramientas de seguridad para aplicaciones web. Aunque algunos de los expertos en seguridad encuestados estuvieron de acuerdo en que la integración de herramientas es un desafío, no creen que las herramientas de seguridad sean demasiado complejas o requieran  de mucha experiencia.

Fuente: The H Security OM

Cómo responder a un ataque de “Denegación de Servicio”

 

 

clip_image001No se puede evitar un abrumador ataque DDoS, pero se puede minimizar su impacto. He aquí cómo.

Los ataques de denegación de servicio (DoS) -particularmente el ataque distribuido de denegación de servicio (DDoS)-  han afectado a muchas empresas recientemente, desde Sony hata el Bank of America. 

Durante años, la mayoría de las compañías amortizaron los ataques DoS, como un riesgo aceptable, ya que la probabilidad de convertirse en víctima era relativamente bajo y el riesgo de daño a la empresa también lo era. Recientemente, sin embargo, esta clase de ataque ha aumentado en popularidad, haciendo que muchas organizaciones reconsideren el riesgo relativo. Directores ejecutivos están preocupados por la pérdida de ingresos y la mala prensa, las TI se preocupan por las aplicaciones bloqueadas y largas horas de trabajo.

Aunque no se puedan prevenir todos los ataques DDoS, hay opciones para limitar su eficacia y permitir que su organización se recuperé más rápido. En la mayoría de los recientes ataques contra aplicaciones Web, los atacantes simplemente envian más solicitudes que la aplicación Web puede manejar, lo que dificulta a los visitantes el utilizarla.

En este tipo de ataques, la mayoría de los atacantes no están preocupados por si el sistema y la aplicación se bloquea en realidad, aunque estarían felices si se produce un bloqueo. Su principal objetivo es evitar que los servicios ofrecidos por la compañía apuntada, responda a las peticiones de los usuarios legítimos, causando problemas para la empresa víctima.

Si usted tiene un control adecuado de la tecnología, estos ataques son fáciles de detectar. Su Network Operations Center (NOC) estará en status quo para el ancho de banda, las solicitudes por segundo y el uso de recursos del sistema con tendencia normal. Entonces, ya sea repentina o después de una pequeña cantidad de tiempo, todas estas tendencias se disparan hacia arriba, se alcanzará los umbrales, y las alertas se enviarán por el sistema de monitoreo.

En una organización típica, estos eventos darán lugar a una escalada en el NOC, y el equipo de TI se apresurará a conseguir a la gente indicada. Gestión recibirá un aviso de que los sitios y las aplicaciones están respondiendo inusualmente, y todos se preguntarán que por qué hay un gran aumento en las solicitudes en un período de tiempo tan corto.

A menos que su sitio haya sido mencionado en la portada de Slashdot, lo más probable es que usted esté experimentando el comienzo de un ataque DDoS. ¡Felicitaciones! Usted es ahora parte del club de las organizaciones que han sido objeto de un ataque DDoS -generalmente porque los atacantes no son seguidores de sus políticas corporativas, o porque se les paga para que ataquen.

El primer paso es analizar los registros de solicitudes.

Leer el resto de este artículo aquí.

Los problemas de seguridad dan a muchas empresas la pausa para que consideren migrar parte de sus operaciones de TI a servicios basados ​​en la nube. Pero se puede mantener la seguridad en la nube. En este informe del Centro de Lectura Dark Tech, que explicará los riesgos y le guiará en el establecimiento de políticas adecuadas de seguridad en la nube, los procesos y controles.

Leer el reporte de Dark Reading (Requiere de un registro gratuito para consultar).

Fuente: Information Week  JRS/GC

Aplicaciones web inseguras, la más grande amenaza de datos.

La mayoría de las empresas, a pesar de tener numerosas aplicaciones de misión crítica accesible a través de sus sitios web, fallan al asignar suficientes recursos financieros y técnicos para asegurar y proteger las aplicaciones Web, dejando los datos corporativos vulnerables al robo. Este es uno de los resultados de un estudio de Imperva, WhiteHat Security y el Instituto Ponemon.

clip_image001

Segun el estudio, la mayoría de los encuestados cree que las aplicaciones Web inseguras representan la mayor amenaza a los datos corporativos. Sin embargo, el 70 por ciento señaló que sus organizaciones no consideran la aplicación de seguridad como una iniciativa estratégica, ni tampoco creen que sus organizaciones tienen suficientes recursos específicamente en el presupuesto en la seguridad de aplicaciones Web para enfrentar el riesgo.

El estudio encontró que sólo el 18 por ciento de los presupuestos de TI en seguridad fueron asignados para hacer frente a la amenaza planteada para aplicaciones Web inseguras, mientras que el 43 por ciento de los presupuestos de TI en seguridad fueron asignados a las redes y seguridad de host, las áreas encuestadas parecían ser de menos preocupación.

De las 10 violaciones de datos en 2009, según la Organización de Derechos de Privacidad, el 93 por ciento de los registros comprometidos fueron robados como resultado de ataques maliciosos o criminales contra las aplicaciones Web y bases de datos – la mayoría de las empresas aún siguen estando muy expuestas.

clip_image002

El estudio de Ponemon reveló que el 61 por ciento de las organizaciones mencionaron tener hasta 100 aplicaciones Web expuestas al publico que realizan transacciones o accesan a millones de registros de clientes. Y además, la mayoría de las organizaciones no ha hecho una aplicación de seguridad de alta prioridad. La encuesta encontró que la gran mayoría de los desarrolladores están demasiado ocupados para responder a las cuestiones de seguridad Web.

“La mayoría de las más grandes y recientes violaciones de datos hasta la fecha han sido el resultado de los ataques contra las aplicaciones Web”, explicó Jeremiah Grossman, fundador de CTO y WhiteHat. “Para hacer frente a las amenazas cibernéticas actuales, las empresas deben cambiar su estrategia de seguridad – y presupuestos – de ser predominantemente basada en las infraestructuras y dar prioridad a los datos y aplicaciones directamente.

Recomendaciones

*No se puede asegurar lo que no sabe que posee – un inventario de sus aplicaciones Web para obtener mayor visibilidad de los datos que están en riesgo y donde los atacantes pueden explotar el dinero o los datos de la transacción.

*Asignar un defensor – Designe a alguien que puede impulsar y dirigir la seguridad de datos y esté altamente capacitado para dirigir numerosos equipos de soporte. Sin rendición de cuentas, la seguridad y el cumplimiento, sufrirán.

*No espere a que los desarrolladores tomen cargo de la seguridad – Implementar tecnologías de protección para mitigar el riesgo de vulnerabilidad en las aplicaciones Web.

*Cambie el presupuesto de la infraestructura para la seguridad de aplicaciones Web – Con la asignación de recursos, el riesgo empresarial puede ser dramáticamente reducido.

El estudio de Ponemon encuestó a 627 profesionales de TI y a más de 400 empresas multinacionales y organizaciones gubernamentales.

Fuente: Help Net Security  CLA/RS

Página 105 de 143

Creado con WordPress & Tema de Anders Norén