Categories
.NET NHibernate PostgreSQL

Mapeo de secuencias de PostgreSQL en NHibernate

En PostgreSQL, para que una tabla tenga un campo autoincrementable se puede usar SERIAL o BIGSERIAL, éstos últimos en realidad no son tipos de datos reales puesto que internamente se crean secuencias para los campos que usan esta sintáxis, por ejemplo:

sql:

CREATE TABLE blog_category (
    id serial NOT NULL,
    name character varying,
    description character varying
);
code:

test=> \d blog_category
                                 Tabla «public.blog_category»
   Columna   |       Tipo        |                       Modificadores
-------------+-------------------+------------------------------------------------------------
 id          | integer           | not null default nextval('blog_category_id_seq'::regclass)
 name        | character varying |
 description | character varying |
 

Para representar representar esa tabla en NHibernate, hay que hacer algo adicional a lo que normalmente se hace con otro tipo de bases de datos:

xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Buayacorp.Domain.BlogCategory, Buayacorp.Domain" table="Blog_Category">

    <id name="Id" type="Int32" unsaved-value="0">
      <column name="Id" length="4" sql-type="int" unique="true"/>
      <generator class="native">
        <param name="sequence">blog_category_id_seq</param>
      </generator>
    </id>

    <property name="Name" type="String">
      <column name="Name" length="255" sql-type="varchar"/>
    </property>
    <property name="Description" type="String">
      <column name="Description" length="3000" sql-type="varchar"/>
    </property>
    <bag name="Blogs" inverse="true" lazy="true" cascade="all-delete-orphan">
      <key column="category_id"/>
      <one-to-many class="Buayacorp.Domain.Blog, Buayacorp.Domain"/>
    </bag>
  </class>
</hibernate-mapping>

En las líneas resaltadas se puede apreciar que para mapear el campo id es necesario especificar el nombre de la secuencia definida en la base de datos, esto es porque para generar los nuevos valores para ese campo se usa la función nextval, que justamente toma como parámetro ese nombre. Por ejemplo, para la siguiente porción de código:

csharp:

using System;
using System.Collections.Generic;
using System.Text;
using NHibernate.Cfg;
using NHibernate;
using Buayacorp.Domain;
using System.Xml;

namespace Buayacorp.Demo
{
    static class Program
    {
        static void Main()
        {
            Configuration cfg = new Configuration();
            cfg.AddAssembly("Buayacorp.Domain");
            ISessionFactory factory = cfg.BuildSessionFactory();

            ISession session = null;
            ITransaction transaction = null;
            try
            {
                session = factory.OpenSession();
                transaction = session.BeginTransaction();

                BlogCategory cat = new BlogCategory("Tecnología", "Blogs con información sobre lo último en tecnología...");
                session.Save(cat);

                Console.WriteLine(cat.Id); // cat.Id ya tiene un valor generado
               
                transaction.Rollback();
            }
            finally
            {
                if (session != null)
                    session.Close();
            }
        }
    }
}

Las consultas que se ejecutan en el servidor de base de datos son:

code:

2007-04-22 17:44:38 PET LOG:  sentencia: SELECT oid, typname FROM pg_type WHERE typname IN ('unknown', 'refcursor', 'char', 'bpchar', 'varchar', 'text', 'name', 'bytea', 'bit', 'bool', 'int2', 'int4', 'int8', 'oid', 'float4', 'float8', 'numeric', 'inet', 'money', 'date', 'time', 'timetz', 'timestamp', 'timestamptz', 'point', 'lseg', 'path', 'box', 'circle', 'polygon')
2007-04-22 17:44:38 PET LOG:  sentencia: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

2007-04-22 17:44:38 PET LOG:  sentencia: select nextval ('blog_category_id_seq')

2007-04-22 17:44:38 PET LOG:  sentencia: ROLLBACK
2007-04-22 17:44:38 PET LOG:  sentencia: unlisten *

Para los curiosos, pueden descargar el archivo que contiene el código mostrado en esta entrada.

Categories
PHP Seguridad Web

PHP: 20 aplicaciones más vulnerables

Ed Finkler, en base a los datos de National Vulnerability Database, publicó una lista de las 20 aplicaciones -desarrolladas en PHP- que más vulnerabilidades tuvieron en el periodo Abril de 2006 - Abril de 2007

20 aplicaciones más vulnerables en PHP

Tal como se comenta en el artículo original, WordPress empezó mal este año y es por eso que está dentro de las cinco aplicaciones más vulnerables para el periodo seleccionado.

Categories
Miniposts Recursos Seguridad

103 aplicaciones gratuitas de seguridad

Para los interesados en mantener la seguridad en sus ordenadores y comunicaciones, pueden revisar la siguiente lista de programas gratuitos.
Fuente: ha.ckers.org

Categories
Seguridad Sql Injection Web WordPress XSS

WordPress: Lista de plugins no recomendados

A continuación muestro una pequeña lista de plugins para WordPress que tienen problemas de seguridad o rendimiento y por lo tanto, no deberían ser utilizados tal cual son descargados; si tienen instalado alguno de éstos, pueden desactivarlos, ponerse en contacto con el autor o solucionar los problemas por sus propios medios - corregí algunos plugins que menciono, pero muchos de los cambios que hago, son específicos para este blog 🙁

  • Acronym Replacer Revisited: Además de los problemas de rendimiento anteriormente descritos, es vulnerable a ataques XSS y CSRF, gracias a este último es posible insertar y ejecutar código PHP arbitrario.
  • Spam Karma 2: Me recomendaron este plugin hace poco y a pesar de lo bueno que parece ser, finalmente lo descarté porque es vulnerable a ataques XSS, CSRF y SQL Injection - ya se imaginarán lo que puede pasar con los datos de sus blogs.
  • Adsense-Deluxe: No realiza ninguna protección contra ataques CSRF, usando este último es posible persistir HTML arbitrario (¿XSS o HTML Injection?).
  • Google Analytics: Falla al intentar protegerse contra ataques CSRF (no es suficiente usar la función check_admin_referer) y cae en el mismo problema que Adsense-Deluxe.
  • catcloud: Ídem al problema que tiene Adsense-Deluxe.
  • Google (XML) Sitemaps: Ídem al problema que tiene Adsense-Deluxe.
  • Related Posts: Ídem al problema que tiene Adsense-Deluxe. Si se usa la versión que incluye el soporte para páginas no encontradas (404), entonces es posible hacer SQL Injection en los blogs que lo usen.
  • Audio player: Ídem al problema que tiene Adsense-Deluxe.
  • wp-cache 2.1: En realidad pongo esta versión del plugin porque Dreamhost todavía sigue instalando la versión vulnerable de wp-cache, que tiene un problema similar a Adsense-Deluxe. Pueden actualizar manualmente a la versión 2.1.1 para corregir este fallo.
  • Pagebar: Es vulnerable a ataques XSS en versiones recientes de WordPress

Imagino que esta lista puede crecer indefinidamente 🙂 pero los que muestro aquí, son aquellos con los que tuve/tengo contacto en este blog y en otros que ayudé a poner a punto.

Nota: Por obvias razones, no voy a publicar detalles o pruebas de concepto de los problemas de seguridad. Por otro lado, por falta de tiempo, sólo me puse en contacto con algunos autores.

A excepción de wp-cache, los problemas mencionados están presentes en las últimas versiones de los plugins.

Categories
.NET AJAX ASP.NET CSRF Miniposts Seguridad XSS

Bug XSS en ASP.NET 2.0 y video sobre XSS, CSRF, Ajax Hacking

Para los interesados: