Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Alex_bro

#1
PHP / Re: administaradores php
8 Marzo 2016, 20:23 PM
Por favor compañero, al menos la próxima vez lee el mensaje antes de enviarlo.

No soy moderador, ni nadie para decir algo así, y mucho menos el que mejor escribe, pero creo que es mejor para todos (y para esta web también, ya que será contenido más rico ante buscadores) que se revisen los mensajes antes de lanzarlos al foro.

Un saludo.
#2
Buenas tardes!

Mi pregunta de hoy está algo relacionada con un tema que abrí hace unos meses: ¿Cómo crear API JSON en proyecto existente que usa MVC?

El caso es que seguí las instrucciones del compañero MinusFour, y ahora tengo dos mounstruos de aplicaciones, con mucho codigo duplicado, y seguramente es que no estoy aplicando bien el MVC, por eso les pregunto.

Durante mi implementación particular del MVC, he creado unos modelos que tratan con la DB, las vistas pues ningún problema, pero en los controladores... ahí está el asunto. Yo tenia entendido que la validación de los datos introducidos por el usuario se debe hacer en los Controladores, pero ¿esto se refiere a todo tipo de validaciones, o solo limpiar entradas...? ¿El modelo debe validar también los datos que le pasan? Con esta pregunta dije... si valido en el modelo, tengo que repetir menos código en mis dos controladores (uno para el API y otro para la web), pero entonces me vino la siguiente cuestión:

Imaginemos que estamos en un modelo que gestiona las Repuestas a los mensajes de este tema, y se introduce una nueva respuesta... necesitamos llamar al modelo que gestiona los temas para ver si el tema_id que se ha pasado por POST realmente existe. Yo esto lo hago en el controlador, para que un modelo no tenga que hablar con otro. ¿Esto es correcto? ¿Dónde deben hacerse las validaciones de este tipo?

Perdón por la parrafada y gracias de antemano, estoy bastante atascado :rolleyes:
#3
Buenas!

A ver si me podeis echar un cable, porque estoy mareado de buscar por internet y creo que no estoy formulando la pregunta correcta.

El caso es que tengo una aplicación web plenamente funcional en PHP, que utiliza el patrón MVC, y en breve necesitaré un API para interactuar con una app nativa en android... Siempre creí que sería cuestión de captar alguna variable de la URL y que el gestor de Views en lugar de cargar las plantillas html, cargase los archivos que formulasen la respuesta JSON con los mismos datos, pero claro, el Controller tampoco puede partir de los mismos inputs en ese modo de funcionamiento (No $_POST...), así que no es tan sencilla la "migración".

¿Cómo se debe enfocar esto realmente? Lo que no quiero es tener que duplicar controllers... uno para la web y otro para el API a menos que no haya otra solución...

Dadme un poco de luz! Gracias :)

Un saludo.
#4
Buenas!

Hoy os traigo una función que publiqué hace tiempo aquí también pero con ciertas mejoras, con la esperanza de que pueda servir a alguien más.

¿Qué permite?

  • Eliminar todos los caracteres que no estén previstos -> Security By Default
  • Cortar las cadenas con más de X caracteres si se desea. Esto puede ayudar a evitar ataques DOS dirigidos expresamente a sobrecargar las consultas a la base de datos
  • Es muy rápida y sencilla de utilizar! He visto buenos aportes en el foro que tienen la advertencia de que es necesario asegurar las variables para su uso real, ya que el compañero lo ha programado con prisas. Con esta función las prisas no deberían ser una escusa!
  • Debería ser suficiente para la mayoría de ataques SQL Injection y XSS, recomendandose encarecidamente su uso conjuntamente con sentencias preparadas (PDO o MySQLi)
  • Elimina espacios en blanco al principio y al final de la cadena, ya que no suelen tener utilidad.

¿Qué NO permite?
No está pensada para validar campos (Ej. Email correcto, etc), solo como primer filtro a pasar por todos los inputs que provengan del exterior. Para esos usos, la función nativa filter_var de PHP puede ser una alternativa.

Personalización
La función está escrita de forma que permita vocales acentuadas y eñes. Si no se desea basta con borrarlos de la cuarta linea. Si dejas estos caracteres asegurate de guardar el archivo que contiene la función con una codificación válida, como UTF-8.
Además, a modo de prevenir ataques XSS aplica la función htmlentities, pero a algunos les gusta aplicarla en la vista de su aplicación... a mi me parece mejor hacerlo al guardar los datos para optimizar la carga en la lectura de datos, pero casi es una cuestión de gustos.

El código

function clean_var($var,$num=0,$let=0,$max=0,$cars_exp=''){
       $expr = '/[^';
       if($num == 1) $expr = $expr.'0-9';
       if($let == 1) $expr = $expr.'a-zA-ZñÑáéíóúÁÉÍÓÚ';
       if($cars_exp != ''){
           $cars_ok = preg_quote($cars_exp,'/');
           $cars_ok = str_replace(' ','\s',$cars_ok);
           $expr .= $cars_ok;
       }
       $expr .= ']/iu';
       $var = preg_replace($expr,'',$var);

       if($max != 0 && strlen($var) > $max){
           $var = substr($var,0,$max);
       }
       return htmlentities(trim($var), ENT_QUOTES); //AntiXSS
}


He intentado ponerle la etiqueta php a code para que se colorease, pero muestra los acentos como entidades html en ese caso.

Ejemplos

Código (php) [Seleccionar]

$secure_var = clean_var($_GET['insecure_var'],1,0,10); // Solo numeros, max. 10 caracteres.
$secure_var = clean_var($_GET['insecure_var'],1,1,10); // Solo numeros y letras, max. 10 c.
$secure_var = clean_var($_GET['insecure_var'],0,1,10,' '); // Letras y espacios, max. 10 c.
$secure_var = clean_var($_GET['insecure_var'],1,1,25,'@._-'); // Posible e-mail. Max 25 c.
$secure_var = clean_var($_GET['insecure_var'],1,1,50,'@._-?)(][,'); // Mas caracteres. Max. 50 c.


Mejoras!
Por favor, si ves algo mejorable en la función dilo abajo! Será de gran ayuda para todos, especialmente si está relacionado con la seguridad. A veces he obtenido comportamientos extraños al usar guiones medios a pesar de usar preg_quote, y ahora intento escribirlos al final del parámetro para que no den problemas... si saben por qué ocurre eso sería genial.

Gracias por leer el tocho! :)
#5
PHP / Re: Diferentes Sub Paginas
6 Abril 2015, 20:59 PM
Amigo yo por lo menos no te entiendo. No dices si usas un CMS o estás programando tu propio sistema. En cualquier caso, bien comenta el nombre del sistema que usas o muéstranos la parte del código propio que crees que falla.

Ojalá podamos ayudarte.

Un saludo.
#6
Es propio.

Básicamente tengo un "BaseController" con funciones básicas (validación e incluir archivos con las vistas) del que heredan los diferentes controllers referentes a cada apartado de la página.

Intento aplicar el patrón MVC pero no me siento cómodo con ningún framework de terceros por ahora.

Saludos.
#7
PHP / Duda sobre MVC y múltiples idiomas.
6 Abril 2015, 12:35 PM
Buenas amigos,

Siento estar tan pesado estos días, como sabéis estoy intentando aplicar bien el patrón MVC de la forma correcta para evitar lo que precisamente me está pasando ahora... marearme con el código al intentar actualizarlo.

Ya tengo un Controller que aplica la lógica y hace comprobaciones de los datos, un Modelo que interactúa con la DB, y una Vista que maneja el HTML (y muestra según el idioma el texto, ya que solo tiene variables que luego se sustituyen como $lang['listar_productos'] y están en un archivo a parte).

Mi único problema ahora está relacionado con los errores que maneja el Controller cuando no está bien un dato introducido por el Usuario.
Ej: El nombre no cumple el mínimo, El Producto no existe...

Desde la clase del Controller no puedo acceder a las variables $lang['error_no_existe_algo'], y no quiero hacerlas globales (para seguir siendo disciplinado y ordenado).

¿Cuál sería la forma correcta de hacerlo? ¿Pasar un código de error a la Vista y que ésta lo resuelva? (y meter lógica a la vista...) ¿Heredar los Controller de una clase que tenga algo como getTextLang()? (lo malo sería hacer miles de foreach por cada vez que consulte no?).

En definitiva, ¿Cómo lo hacéis para manejar los idiomas con MVC?

Muchas gracias!
#8
Gracias por contestar.

Llevo toda la tarde intentando rediseñar la estructura del proyecto, pues la verdad es que está algo avanzado, pero bueno mejor hacerlo ahora que no cuando sea demasiado tarde.

Lo de crear un Producto desde Pedidos era un ejemplo, me refería a funciones que son compartidas en las dos clases (o modelos) como por ejemplo el metodo checkExisteProducto() puede ser útil en el módulo (o controller) de Pedidos (para verificar que se inserta uno que exista de verdad) pero también en las páginas de ver y editar Producto (verificar si existe o no ese producto antes de verlo o editarlo). Éste es un ejemplo de unas cuantas funciones que se comparten, y duplicarlas en las distintas clases rompe totalmente el concepto de reusabilidad.

Voy a mirarme lo que me comentas de patrón Factory y te digo.

Gracias de nuevo.
Saludos.

Edito:
Después de ver muchos ejemplos, acabo de darme cuenta de que mi problema era que aplicaba mal el patrón MVC al incluir parte de la lógica en los modelos (lo que yo llamaba classPedidos etc.) y parte de la lógica en los controllers (mis moduloPedidos etc.), lo que me impedia cualquier forma de reutilización.

Estoy reorganizando todo el código desde el principio, es mucho trabajo, pero creo que merece la pena de cara al futuro.

Muchas gracias por la ayuda!
#9
Crea en la base de datos una columna en la tabla de los usuarios que se llame "id" y marca auto_increment, de esa forma, cada vez que hagas un INSERT... se creará ese id incrementando en uno cada vez.

Al usar UPDATE tienes que especificar ese id en el WHERE para que no se modifiquen todos los registros de la tabla como comentas.

Ejemplo:
Código (sql) [Seleccionar]
UPDATE usuarios SET name = 'Pepe' WHERE id = '3'

Saludos.
#10
Amigo la solución que te dieron es la correcta, eso se hace con mod_rewrite en el archivo .htaccess

Ejemplo:
Código (php) [Seleccionar]
RewriteRule ^user/([a-zA-Z0-9]+)/$ user.php?id=$1 [L,NC]

Así, conviertes las direcciones como user/3/ en user.php?id=3

Espero que te ayude.

Saludos!

Edito:
Se me olvidó comentarte que significa lo de [L,NC]. Se les denominan Flags (por si quieres buscar más sobre el tema).
L (Last Rule) deja de leer las demás reglas al cumplirse esta.
NC es para que le de igual si son mayúsculas o minúsculas.