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ú

Temas - gAb1

#1
Hola, voy a comprarme una tele nueva y como va tener wifi y todo eso, estoy pensando en poner un disco duro en red (conectado al router) para poder acceder a el desde la tv directamente.

He estado viendo y necesito un tipo de docking station para disco duro sata3, pero no encuentro ninguno que en lugar de usb3 vaya a gbe.

¿Podéis recomendarme alguno que no sea muy caro? Voy justo de presupuesto y no necesito ninguna característica especial, simplemente que me conecte el disco a la red.

Gracias.
#2
Hardware / ram para procesador ryzen 5 2400g
2 Abril 2018, 22:01 PM
Hola, voy a montar un equipo para un amigo y como va justo de presupuesto he pensado en ponerle el nuevo ryzen 5 2400g (probablemente una vez salgan las placas con el nuevo chipset).

Como nunca he tenido una APU, no he tenido necesidad de overclockear la RAM, mi pregunta es, si compro un kit 2x4GB a 2400, podré subirlo a 3200 estable y latencia aceptable? O es mejor comprar un kit que vaya ya a 3200? o de 3000? Lo digo más que nada por el precio, que siguen estando muy caras...

¿Que kit de memoria me recomendáis? https://www.amazon.es/s/url=search-alias%3Daps&field-keywords=ddr4+2x4+3200

Pienso que con 8 GB (2 para vram, el resto para sistema) va a ir bien servido.

Gracias!
#3
Tengo un monitor que un día dejo de funcionar, se encendía y a los pocos segundos se "apagaba", digo esto porque ya he descubierto el problema, es el backlight (dos tiras, una arriba y otra abajo del panel, con dos tubos fluorescentes cada una) que al parecer están fundidos y al no haber iluminación la imagen no se ve.

Es una duda tonta, he encontrado estas tiras led en aliexpress pero mi duda es: tengo que poner 2 arriba y 2 abajo o es solo una? Es que cada tira de tubos fluorescentes tiene 2 tubos, por eso no estoy seguro y no sé si comprar 2x2 o con 1x2 podré reparar el monitor.

Agradecería alguien con más experiencia que aclarara la duda.

Gracias.
#4
Para mi próxima build estoy buscando un monitor de 34" UWQHD (3440x1440) curvo, para dar el salto de mis 3 monitores normales (24" 1920x1080).

Ya que voy a tener que invertir de 700 a 1000 € preferiría esperar a que tuviese las siguientes características que lo harán future-proof:

1. HDR10+
2. 10-bit
3. Freesync 2 (si, la nueva versión lanzada por AMD a principios de año)

He estado buscando pero no he podido encontrar ninguno, solo con Gsync.

¿Alguien ha visto alguno?
#5
Hola, voy a montar un pc a un amigo que tiene 500€ de presupuesto, pero me he pasado por 65,85€ (más 8.25€ de envio).

Lista en PCComponentes:

- Case: Nox Hummer MC USB 3.0 Negra 49,95 €
- PSU: Seasonic Eco Series 430W 80 Plus Bronze 49,95 €
- Mobo: Asus PRIME B350M-K 83,00 €
- CPU: AMD Ryzen 5 1400 3.2GHZ BOX 179,00 €
- RAM: G.Skill Aegis DDR4 2400 PC4-19200 8GB CL15 63,00 €
- HDD: Seagate BarraCuda 3.5" 1TB SATA3 45,95 €
- GPU: MSI Radeon RX 550 AERO ITX 2G OC 2GB GDDR5 95,00 €

El ordenador es para cosas básicas, algo de edición de video y poco mas. Como Intel sigue bastante caro, paso de comprar uno, además el 4c/8t más barato que tienen es el i7-7700 por 309€, por lo que el ryzen 5 1400 por 179€ está bastante bien y en unos meses o un año seguro que rinde igual.

¿Creeis que vale la pena esos eurillos de más? ¿Cambiariais algo?
#6
Estoy configurando un servidor mail con postfix y tengo el siguiente problema cuando uso un dominio como principal:

# /etc/postfix/main.cf
myhostname = mail.example.com
# no need for mydomain, will be example.com


Cuando envio un mail a me@example.com, postfix da el siguiente error:

postfix/smtpd[3540]: NOQUEUE: reject: RCPT from mail-oln040092065078.outbound.protection.outlook.com[40.92.65.78]: 550 5.1.1 <me@example.com>: Recipient address rejected: User unknown in local recipient table;

El error no tiene ningún sentido, ya que esta todo bien configurado, la prueba de ello es que si quito ese dominio del `hostname` y uso otro, funciona pero ahora el error lo da para el dominio que esta en hostname.

La solución hasta ahora ha sido poner un hostname falso, pero necesito configurar rDNS y para ello tengo que usar un dominio real para que resuelva la IP.

¿Alguien sabe por qué da ese error?

Gracias.
#7
Me pregunto si es posible comprobar que los datos de registro en un sitio web sean verdaderos y no inventados.

En una de mis aplicaciones web permito que los usuarios se registren para vender/ofrecer servicios, tanto a particulares como a empresas y profesionales. A parte de tener una clausula que me proteja legalmente del uso que hagan los usuarios de mi software como servicio (Saas), me gustaría ir a lo seguro y poder comprobar esto.

Aclaro, cuando digo comprobar, no me refiero a saber información personal, simplemente saber si sí o si no. Lo que NO quiero es:

- Tener un nif y saber el nombre completo, etc...
- Tener un nombre completo y saber el nif, etc...

Por eso, lo que me gustaría hacer sería, hacer una petición a algún organismo del gobierno, creo que sería aeat, enviando por POST la información introducida por el usuario para comprobar que es real (nombre o razón social, nif, etc) y saber lo que responde en los distintos posibles casos.

Buscando en la pagina de hacienda (aeat) he visto que publican los nombres, nifs, etc de las empresas desde el año 2006, tanto las revocadas como las rehabilitadas: http://www.agenciatributaria.es/AEAT.internet/Inicio/La_Agencia_Tributaria/Campanas/Censos__NIF_y_domicilio_fiscal/Empresas_y_profesionales__Declaracion_censal__Modelos_036_y_037/Tramitacion_y_consultas/Consulta_de_NIF_revocados_y_rehabilitados/Consulta_de_NIF_revocados_y_rehabilitados.shtml

Con eso ya podría comprobar a las empresas y profesionales / autónomos / freelancers, pero no a los particulares.

A lo mejor estoy exagerando, no lo sé, es la primera vez que me meto en estos temas. ¿Sabéis como lo llevan otras páginas que permitan a sus usuarios vender o ofrecer servicios? Como milanuncios o cualquier otra página. ¿Este tipo de páginas comprueban con hacienda los datos de sus usuarios? O ¿simplemente se protegen con clausulas en los términos y condiciones?

Gracias!
#8
Voy a comprar una tarjeta de red GbE y me gustaría saber vuestra opinión.

¿Cuales son las diferencias entre estos tres controladores? A parte del precio, quiero saber si realmente voy a necesitar intel. Voy a montar un router micro-atx y claro, tiene que tener un mínimo de calidad y estabilidad. ¿Puede una realtek ofrecerme esto?

Al equipo conectaré un par de ordenadores domésticos, otro router (tp-link) y de momento un solo servidor (justo son 4 puertos los que necesito).

Agradecería cualquier recomendación con un link para ver el precio y donde comprarla.

Gracias!
#9
Redes / tarjeta de telefonia VoIP (FXO o FXS)
16 Febrero 2017, 14:48 PM
Es la primera vez que voy a comprar una de estas tarjetas y no tengo mucha idea al respecto.

He estado leyendo sobre esto, pero no termina de quedarme claro. Lo que quiero hacer es conectar teléfonos a un equipo que estará conectado a la red de fibra óptica (GPON).

Agradecería si pudierais explicarme como funciona lo de FXS y FXO, y cual de los dos necesitaría conectar a la tarjeta PCI.

Las tarjetas (con ambos módulos) que he encontrado en ebay son: http://www.ebay.com/bhp/fxo-pci, solo necesito saber que tipo de modulo necesito.

Estas son las características necesarias para que funcionen las lineas que me provee mi ISP:

Citar- SIP (RFC3261)
- Codec: G.711 (μ-law and A-law), G.723, G.729, G.722
- RTP/RTCP (RFC 1890)
- Echo cancellation
- VAD/CNG
- DTMF
- T.38 FAX
- Caller Identification / Call Waiting / Call Forwarding / Call Transfer / Call Hold / 3-way Conferencing
- FXS: two or more RJ-11 ports for VoIP

¿Que tarjeta y modulo (x4) necesitaría para que mis lineas funcionen? Por lo que he estado leyendo y lo que me ha dicho mi ISP parece ser que necesito módulos FXS.

Espero que no me haya olvidado de ningún dato importante.

Gracias!
#10
Voy a montar un equipo micro-atx para que haga de router (todo en 1) y un requisito indispensable es que los componentes estén soportados por las ultimas versiones del kernel Linux.

Por favor, dejar la configuración que vosotros eligiriais para un equipo micro-atx con linux.

Algo básico sería:

- Una caja cubo de unos de ~70-80 € (o menos).

- Placa base mATX marca Gigabyte o Asus de unos ~80 € (también acepto sugerencias de otras marcas).

- Procesador de unos ~80-100 €

- 2x4GB RAM 70 € (para 3-6 ordenadores domésticos, un par de servidores y alguna que otra aplicación directamente en el router, ¿irá bien?)

- Fuente de alimentación Seasonic 350W, creo que están por los ~40€.

- SSD: Samsung 850 EVO 250GB 90€

- Wireless Card: ASUS PCE-AC88 100 €

- GbE Card: Una tarjeta de red de 4 puertos gigabit ?? €

- VoIP Card: Una tarjeta para conectar telefonos VoIP (2xRJ11 o mas) ?? €

- SFP+ Card: Foro redes

- GPON SFP-ONU Module / Transceiver: foro redes

El presupuesto que le doy es de unos ~900 € (200 calculados a ojo de la tarjeta y modulo SFP).
#11
Es una pregunta más de compatibilidad que de "como se hace".

Las tarjetas de red Ethernet y Wireless, si quisiera separar los equipos conectados por cable y wifi (unos de otros), eso sería configuración solo o las tarjetas de red tienen que soportar VLAN?

Por ejemplo, si tengo ordenadores domésticos conectados por ethernet y wifi al router, y quiero separarlos. Y para complicarlo todavia más, también servidores conectados por ethernet al mismo equipo. Segmentar la red para crear multiples VLAN, una para cada servidor, otra para los ordenadores conectados por cable y otra para los conectados por wifi.

¿Las tarjetas tienen que tener alguna característica especial para soportar esto? Si es así, me podeis recomendar alguna?

La tarjeta wireless sería la que he puesto en presupuesto componentes para equipo micro-atx compatible con linux. La de ethernet todavía no he buscado ninguna.

Gracias!
#12
Tengo en mente montar mi propio router y que sea económico es una de las principales características  ;D

He estado buscando y no encuentro tarjetas con puerto de fibra por menos de 100 euros, ¿alguien sabe de alguna página o sitio donde pueda encontrarlas a un precio asequible?

Solamente necesito 1 puerto de fibra, y a poder ser como mínimo que sea gigabit, aunque si la diferencia no es muy grande 10gb sería genial, pero seguramente se vaya de presupuesto.

Estamos en 2017! Pensaba que ya habrían bajado de precio... Me siento como cuando una tarjeta de red de 10Mb valía más de 30.000 pesetas  :-\

Seria mejor preguntar en el foro de Redes?

Gracias!
#13
Hola, tengo un problema al enviar información al servidor, resulta que la primera vez que hago click en el boton no se envia nada, pero a partir de la segunda vez ya se envia la petición...

Resulta que estoy usando dropzone para subir imagenes, además tengo un formulario que quiero validar con javascript (más que nada para que el usuario no tenga problema y al enviarlo al servidor todo valide). Entonces, primero inicializado dropzone y dentro del init llamo al plugin que valida "en tiempo real" los campos del formulario. En el callback (una vez el formulario este validado) es cuando proceso la cola de las imagenes y seguidamente añado los datos del formulario para que se envie todo junto.

Este es el plugin (solo la parte que llama al callback):

Código (javascript) [Seleccionar]
(function($) {
   $.fn.formly = function(callback) {
       $('a#click').on('click', function() {
           if (callback) {

               var clientInfo = form.find(':input').serializeArray();

               clientInfo.splice(-1, 1);
               clientInfo.splice(-1, 1);

               // Password hash function
               var p = $('#reg_pwd').val(),
                   c = $('#confirm_pwd').val(),
                   shaObj = new jsSHA('SHA-512', 'TEXT');

               shaObj.update(p);
               var p_hash = shaObj.getHash("HEX"),
                   shaObj = new jsSHA('SHA-512', 'TEXT');

               shaObj.update(c);
               var c_hash = shaObj.getHash("HEX");

               callback(clientInfo, p_hash, c_hash);
           }
       });
   };
})( jQuery );


Y el init de dropzone:

Código (javascript) [Seleccionar]
init: function() {
   var myDropzone = this;

   $('#register').formly(function(clientInfo, p_hash, c_hash) {
console.log(myDropzone);
       myDropzone.processQueue();

       myDropzone.on('sending', function(data, xhr, formData) {
           formData.append('client_info', JSON.stringify(clientInfo)),
           formData.append('particular', 0),
           formData.append('reg_pwd', p_hash),
           formData.append('confirm_pwd', c_hash)
       });

   });

   myDropzone.on('success', function(file, response) {
       myDropzone.removeFile(file);
       console.log( 'Error: ' + response );
   });
}


La primera vez que hago click, puedo ver en consola el objecto myDropzone, sin embargo no se envia la petición al servidor. La segunda vez, si que envia la petición y recibo respuesta.

¿Que puedo estar haciendo mal?

Gracias!
#14
A lo  mejor me equivoco, pero diria que si se reserva una ip del pool del dhcp, esta solo tendría que asignarse al equipo con la mac reservada, ¿no es asi?

Acaba de conectar mi movil por wifi y me está dando una ip reservada que tengo para otro equipo que va por cable... ¿Alguna manera de evitar esto?

Gracias.
#15
Hola, estoy teniendo problemas para configurar los permisos del directorio document root de apache.

Creé un usuario para usar el ftp y le cambie el dueño a la carpeta /srv/http a mi usuario para poder subir los cambios, pero ahora resulta que apache no tiene permisos de escritura (mkdir() da error de permisos).

¿De qué manera puedo configurar los permisos del document root (/srv/http) para que tanto apache (http) como mi usuario puedan tener permisos? ¿Quien debería ser el dueño del directorio? ¿Root, http o yo?

Gracias.
#16
Hola buenas, resulta que tengo un pequeño problema, me he puesto a hacer limpieza y a cambiar de sitio los altavoces de mi ordenador, para que esten bien posicionados y resulta que se me ha quedado corto el cable del altavoz satélite central.

Tienen conector RCA (sin color) y van conectados al subwoofer. Mi pregunta es, si compro un simple alargador, ¿funcionaria?

¿Alguien sabe de algún sitio web donde vendan?

Gracias!
#17
Estoy tratando de configurar manualmente los vhosts para varias páginas, aunque de momento estoy trabajando con un solo dominio, la idea es ir poniendo más. De momento estoy intentando configurar un solo dominio y varios subdominios.

La configuración vhosts la he repartido en varios archivos especificos para cada dominio/subdominio, así puedo activarlos o desactivarlos facilmente (tal y como recomiendan en la guia de arch linux):

httpd.conf
Código (apache) [Seleccionar]
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
# Available Vhosts
Include conf/vhosts/example.dom
Include conf/vhosts/sub1.example.dom
Include conf/vhosts/sub2.example.dom


El archivo de configuración principal lo dejo para el bloque vhosts por defecto, el que se use cuando se accede al servidor mediante la ip pública o los nameservers (ns1.example.com), etc... Aquí estoy teniendo problemas y necesito saber como configurar correctamente el bloque vhosts default.

Código (apache) [Seleccionar]
<VirtualHost xxx.xxx.xxx.xxx:*>
    DocumentRoot "/srv/http/default"
    ServerName localhost
</VirtualHost>


o

Código (apache) [Seleccionar]
<VirtualHost *>
    DocumentRoot "/srv/http/default"
    ServerName localhost
</VirtualHost>


Si uso el primero se muestra siempre (da igual que pongas dominio/subdominio) el main document root de apche, que en arch linux es /srv/http y claro... puedes navegar por todas las carpetas que tengas (incluso desactivando -Indexes puedes usar la barra de navegación para averiguar nombres...).

Si uso el segundo se muestra siempre la carpeta default.

He probado quitando el bloque virtualhost default (comentando el archivo en httpd.conf) y lo mismo, se ignoran los bloques virtualhost de cada archivo, y siempre se muestra el main document root.

Código (apache) [Seleccionar]
# conf/vhosts/domain.dom
<VirtualHost domain:80>
    ### Igual que abajo pero sin la configuración SSL
</VirtualHost>
   
<VirtualHost domain.com:443>
    ServerAdmin webmaster@domain.com
    DocumentRoot "/srv/http/domain.com/www"
    ServerName domain.com:443
    ServerAlias www.domain.com:443
    Protocols h2 h2c
   
    <Directory "/srv/http/domain.com/www">
        Require all granted
   
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteBase /
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^index\.php$ - [L]
            RewriteRule . index.php [L]
        </IfModule>
    </Directory>
   
    <IfModule dir_module>
        DirectoryIndex index.php
    </IfModule>
   
    #SSLEngine on
    #SSLCertificateFile "/etc/httpd/conf/apache.crt"
    #SSLCertificateKeyFile "/etc/httpd/conf/apache.key"
    ErrorLog "/var/log/httpd/domain.com-error_log"
    CustomLog "/var/log/httpd/domain.com-access_log" common
</VirtualHost>


Esta configuración funciona en mi ordenador personal, usando el sistema operativo Manjaro (que es Arch Linux) y recuerdo que funcionaba bien. Ahora estoy configurando un servidor ARM de scaleway y estoy usando arch linux.

¿Como puedo configurar correctamente los virtual hosts para que haya un bloque que muestre una página por defecto cuando ningún nombre de dominio/subdominio coincida con los que tengo?

Gracias.
#18
Hola, estoy intentando configurar un servidor web apache con virtualhosts pero la configuración que tengo no funciona correctamente.

Estoy en arch linux por lo que el document root es /srv/http. He creado varios archivos para cada dominio/subdominios (vhost) para tener la configuración bien organizada y poder activar/desactivar facilmente cada uno desde el httpd.conf. El archivo conf/extra/httpd-vhosts.conf solo tiene un bloque * con un documentroot a /srv/http/default (por si accedes usando los name servers que se muestre la página default).

El problema es que todos los dominios/subdominios llevan al document root de apache, que es /srv/http, en lugar del document root del dominio, especificado en cada bloque <VirtualHosts> correspondiente. Por lo que cuando accedo con el dominio o subdominio, se muestra /srv/http y puedo navegar por todas las carpetas de cada dominio/subdominio e incluso las carpetas que deberían ser privadas, como framework o files (desde la barra escribiendo los nombres).

La configuración de apache importante es la siguiente:

Código (apache) [Seleccionar]
DocumentRoot "/srv/http"
<Directory "/srv/http">
   Options -Indexes +FollowSymLinks

   AllowOverride None

   Require all granted
</Directory>

...

# Virtual hosts
Include conf/extra/httpd-vhosts.conf
# Enabled Vhosts
Include conf/vhosts/domain.dom
Include conf/vhosts/sub1.domain.dom
Include conf/vhosts/sub2.domain.dom


Si comento #Require all granted o lo cambio a all denied da error 403... ¿como hago para que no sea accesible el documentroot mediante el navegador?

Asi són los bloques <VirtualHosts>, uno para el puerto 80 (http) y otro exactamente igual, incluyendo la configuración SSL, para el puerto 443 (https):

Código (apache) [Seleccionar]
# conf/extra/httpd-vhosts.conf
<VirtualHost *>
   ServerName default.localhost
   DocumentRoot "/srv/http/default"
</VirtualHost>

# conf/vhosts/domain.dom
<VirtualHost domain:80>
   ### Igual que abajo pero sin la configuración SSL
</VirtualHost>

<VirtualHost domain.com:443>
   ServerAdmin webmaster@domain.com
   DocumentRoot "/srv/http/domain.com/www"
   ServerName domain.com:443
   ServerAlias www.domain.com:443
   Protocols h2 h2c

   <Directory "/srv/http/domain.com/www">
       Require all granted

       <IfModule mod_rewrite.c>
           RewriteEngine On
           RewriteBase /
           RewriteCond %{REQUEST_FILENAME} !-d
           RewriteCond %{REQUEST_FILENAME} !-f
           RewriteRule ^index\.php$ - [L]
           RewriteRule . index.php [L]
       </IfModule>
   </Directory>

   <IfModule dir_module>
       DirectoryIndex index.php
   </IfModule>

   #SSLEngine on
   #SSLCertificateFile "/etc/httpd/conf/apache.crt"
   #SSLCertificateKeyFile "/etc/httpd/conf/apache.key"
   ErrorLog "/var/log/httpd/domain.com-error_log"
   CustomLog "/var/log/httpd/domain.com-access_log" common
</VirtualHost>


Gracias.
#19
Hola, tengo que elegir que motor usar para una tabla que va recibir muchos selects, pero que necesita transacciones para hacer rollback...

La tabla almacena datos que los usuarios introducen y por lo tanto necesita hacer rollback por si surge algún problema a la hora de ingresar en otra tabla asociada. Pero principalmente va a recibir muchos selects (acompañados de JOIN).

Mi pregunta es, ¿que motor uso en este caso?

Al principio no habria problema con usar InnoDB, pero en cuanto empiece a llenarse la tabla y hayan más de 10.000 records el rendimiento podria disminuir enormemente... ¿que hago? ¿o son pocos 10.000? (a menos que tenga mucho exito la web, no creo que hayan más...)

Gracias.
#20
Redes / dns para hosting y dominio web
29 Julio 2016, 15:12 PM
Hola, estoy configurando un servidor y un dominio para poner una web online y posiblemente otros servicios.

He estado leyendo algunas guias pero me quedan unas dudas especificas sobre dns y ns:

1. El dominio principal o FQDN, ¿puede ser cualquiera? ¿O tiene que ser el de la web principal?

2. El hosting en el que estoy no tiene nameservers, tiene que ser la IP que yo reserve para usar en el servidor. Por lo que es necesario crear nameservers customs, usando el dominio principal. Supongo que si voy a poner más webs sería lo más facil, ¿no? Usar mis propios nameservers para otros dominios.

3. ¿Mis nameservers tienen que tener distintas IPs? ¿O puedo crear 2: ns1 y ns2; y apuntarlos a la misma IP (la de mi servidor)? Creo que no se pueden asignar más de una IP al mismo servidor (por lo menos en el hosting que estoy no veo la opción, solo hay una lista para elegir una).

Hay una guia (un poco antigua pero creo que serviria igual) de 1and1 (donde tengo el dominio) y el proceso es muy facil: crear 2 subdominios y cambiarles el A-Record a la IP del servidor. Pero aquí veo dos problemas:

1. En la guia dice que tienen que ser IPs distintas, y

2. Actualmente tengo el dominio configurado a dos dns (que he creado usando el servicio gratuito no-ip.com, ambos apuntan a la IP de mi servidor), en lugar de usar los de 1and1. Cuando intento cambiar la IP de los nameservers me dice que el dominio princpial tiene que tener la configuración de dns de 1and1 en lugar de custom.

Por lo que mi duda aquí sería: Para configurar mis dos subdominios (para usarlos como nameservers), la configuración dns del dominio tiene que ser la de 1and1 (para poder cambiar el A-Record), pero luego la guia dice que cambie la configuración dns a custom y use los que acaba de crear, entonces ¿se desconfigurarian los subdominios?

Esta es la guia en cuestión: https://kb.iweb.com/entries/21788473-Creating-Private-Nameservers-at-1and1-com

Finalmente, los subdominios y otros dominios, ¿se pueden crear directamente desde el hosting? Por ejemplo, yo estoy usando VestaCP y tiene configuración DNS, por lo que ¿todo lo demás podría configurarlo desde ahí usando mis nameservers?

Gracias.
#21
Siempre he usado paneles de control, tipo cpanel, kloxo, etc... Pero me gustaría aprender a hacerlo manualmente y tengo un par de dudas que no consigo encontrar (o entender) en las guias existentes.

Primero decir que voy a usar ultima versión de todo, incluido el protocolo http/2. El servidor sería el típico LAMP. Solo que en lugar de mysql, mariadb.

El objetivo principal sería tener en cuenta cuestiones de seguridad importantes (y menos importantes también), como famosos problemas de openssl (arreglados en la ultima versión, por suerte) con los certificados de seguridad (esta sería la parte a configurar, si no me equivoco sería algo como "SSLProtocol -all +TLSv1.2, ¿no?).

Para ello tengo como referencia la guia LAMP de arch linux (que es de las más completas, con referencias a cuestiones de seguridad más importantes, como la de sslv3, si alguien conoce alguna más a tener en cuenta, agradeceria que la mencionara (opcionalmente con la solución)).

Una de mis primeras dudas sería el uso de mod_rewrite en los .htaccess. He estado leyendo y al parecer es algo recomendado y no recomendado. Algunos afirman que no se debe usar (en la propia web se aconseja usar como ultimo recurso) y otros explican que no hay razón para no usarlo y que además tiene sus ventajas: http://askubuntu.com/a/222880.

No voy a usar un hosting compartido ni un VPS, voy a contratar un baremetal (dedicado) de scaleway y voy a instalar/configurar todo yo mismo, por lo que no tendría razón para usarlo más que por las posibles ventajas.

CitarApache2 reads all config files in /etc/apache2/conf.d/. This can be good for any general configuration directives you want to add that don't relate to any particular virtual host. Just add a new file there and put config into it.

Creo que prefiero configurarlo ahí y desactivar htaccess, pero esa ruta es especifica de ubuntu creo, en arch linux es /etc/httpd/conf, ¿es ahí dentro donde puedo crear mis propios archivos de configuración? Más que nada por si alguien consigue acceder al document root mediante php, que no pueda cambiar ninguna configuración local. ¿Tiene sentido o de todas maneras seguiria habiendo riesgo? Como cambiar configuraciones desde php (la cuestión sería como configurarlo para conseguir entornos de producción seguros).

Actualmente uso htaccess con una configuración u otra dependiendo del dominio/subdominio: Por ejemplo, la web principal (y algunos subdominios) redirige todo al index.php, que sería el router de la web y usando php, incluyo archivos dependiendo de la url (y sus parametros get). Pero en el subdominio static, donde almaceno los archivos incluidos estáticos (como javascripts, css e imágenes) he deshabilitado php y aparte configuro CORS para que el dominio principal y otro subdominio puedan cargar contenido. ¿Todo esto podría hacerse desde la configuración interna en /etc/httpd/conf? ¿Mejoraria de alguna manera la seguridad?

Otra cosa que tiene un poquito que ver con la seguridad es, la redirección de http a https automática. En kloxo hay una opción para forzar la redirección, pero no veia nada en el .htaccess, por lo que debe hacer en alguna otra parte, ¿será en alguna configuración interna de apache? La redirección automatica de no-www a www sería en el mismo archivo, ¿no?

Gracias!
#22
Estoy usando un plugin jquery llamado formly para verificar los campos antes de mandarlos. El problema es que el evento on submit (dentro del plugin) no detiene el submit y el formulario se sigue enviando de todas formas...

Código (javascript) [Seleccionar]
(function($) {

$.fn.formly = function(callback) {

    // Submit button
    this.on('submit', function(e) {

        // NOT WORKING AT ALL...
        e.preventDefault();
        var canSubmit = true;

        $(this).find('input').each(function() {

            // Required
            if ($(this).attr('required')) {
                canSubmit = functions.required(this);
            }

            // Validate
            if ($(this).attr('validate')) {
                canSubmit = functions.validate(this);
            }

            // Match
            if ($(this).attr('match')) {
                canSubmit = functions.match(this);
            }

        });

        if (canSubmit) {
            if (callback) {

                var clientInfo = $(this).serializeArray();

                /* Password hash function */
                var p = $('#reg_pwd').val(),
                    c = $('#confirm_pwd').val(),
                    shaObj = new jsSHA('SHA-512', 'TEXT');

                shaObj.update(p);
                var p_hash = shaObj.getHash("HEX"),
                    shaObj = new jsSHA('SHA-512', 'TEXT');

                shaObj.update(c);
                var c_hash = shaObj.getHash("HEX");

                callback(clientInfo, p_hash, c_hash);
            }
        }

    });


En mi archivo scripts.js llamo al plugin y pongo el callback que es el que debería enviar el formulario (dropzone se tiene que encargar de esto, junto a la imagen):

Código (javascript) [Seleccionar]
        $('#register').formly(function(clientInfo, p_hash, c_hash) {

            Dropzone.autoDiscover = false;
            $('#myDropzone').dropzone({
                init: function() {
                    var myDropzone = this

                    myDropzone.processQueue();

                    myDropzone.on('sending', function(data, xhr, formData) {
                        formData.append('client_info', clientInfo);
                        formData.append('reg_pwd', p_hash),
                        formData.append('confirm_pwd', c_hash);
                        console.log('I just sended the info...');
                    });

                    myDropzone.on('success', function(file, response) {
                        myDropzone.removeFile(file);
                        response == '' ? window.location.replace('//admin.inmopaco.tk/') : alert('success_' + response);
                    });
                }
            });

        });


Para poco, dropzone me da error diciendo que ya esta inicializado... y no se sube nada. Dropzone lo tengo que inicializar fuera de formly y luego dentro tengo que procesar el queue y enviar el formulario. ¿Como prodría hacer esto sin reinicializar dropzone para que no de error?

¿Y para evitar que el formulario se envie al darle al boton? Tiene que ser dropzone el que envie el array y los hashes.

Gracias!
#23
Hace poco me cambie de hosting y le instale la ultima versión de php. Ahora el rollback no hace nada: no da error, el if en el que lo puse da true siempre y los datos se siguen insertando.

Antes usaba php 5.4 y así es como tenia mi script:

Código (php) [Seleccionar]
public function Upload() {

   try {

       // rollback should revert here
       // el único cambio es el siguiente
       // $mysqli->query('START TRANSACTION;');
        $mysqli->begin_transaction();

       // multiple prepared statements

       if ($mysqli->commit()) {
           $exit = $log;
       } else {
           throw new Exception('Transaction commit failed. Property ID: ' . $id);
       }

   } catch (Exception $e) {

       try {

           $test = $this->owner['id'] ? 'property' : ($this->applicant ? 'demand' : 'Fatal Error: PropertyFromInput() contact error (no owner, no applicant)');

           $log = 'Rolling back new ' . $test . ' upload' . "\n";

           if (!$mysqli->rollback()) $log .= 'no rollback...' . "\n";

           if ($test == 'property') $log .= $this->cleanup_prop() ? 'property successfully cleaned up' . "\n" : 'error while cleaning up property' . "\n";

           $err_msg = $e->getMessage();

       } catch (Exception $f) {

           $err_msg .= $f->getMessage();

       }

       $usr_msg = $upload_err ? $err_msg : 'Se ha producido un error. Por favor contacte con un administrador.';

       $log .= 'User triggered an error while uploading a new ' . $test . ".\n" . 'Error message: ' . $err_msg;

       $exit = array($log, $usr_msg);

   }

   $mysqli->autocommit(TRUE);

   return $exit;
}


Antes funcionaba y ahora ya no. Supongo que se debe a los cambios que ha sufrido php desde entonces.

Estuve leyendo un poco y al parecer decidieron (al fin) implementar el bloque finally, en php 5.5. El otro cambio relevante a esto fue en php 7 donde se mejora el manejo de errores.

Pero sigo sin estar seguro de donde puede estar el fallo. La única utilidad que le veo a finally en mi caso sería poner el autocommit, por que el return deberia ir fuera. Y no sé que más puede estar fallando.

¿Alguna idea? Gracias!
#24
Estoy teniendo problemas para extender un código existente que guarda imágenes.

Los usuarios pueden subir imagenes y también tienen que poder actualizarlas (eliminar y subir nuevas). Lo primero es lo que tengo terminado, pero lo segundo tengo dudas ya que no quiero guardar las imagenes con su nombre original y en su lugar uso el número del array:

Código (php) [Seleccionar]
$tmp_name   = $_FILES['file']['tmp_name'];

for($i = 0; $i < count($tmp_name); $i++) {

   $img_name   = '/' . ($i + 1) . '.jpg';

}


Por lo tanto si uso este código la segunda vez que suba imágenes, las que ya existen serán reemplazadas. No me importa si el orden se pierde (pero si es posible prefiero algo limpio):

1.jpg, 2.jpg, 3.jpg ---> 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg

¿Conoceis alguna manera más limpia de hacer esto? No me importa el nombre que tengan, no es de ningún uso.

Podría usar la hora de subida, algo así, pero me gustaría saber vuestras opiniones y como lo haríais vosotros.

Esta es la función completa, ¿podria mejorarse para que fuera más eficiente?

Código (php) [Seleccionar]
public function UploadImages($files, $test = '') {

   $imagesPath     = '../static.website.com/images/property/' . $this->id;
   $thumbnailsPath = '../static.website.com/images/property/' . $this->id . '/thumbnails';

   $log = 'Logging Images Upload:' . "\n\n";
   $upload_err = FALSE;

   if ($test == 'new') {

       // Will be any problem with $thumbnailsPath?
       if (!mkdir($imagesPath) && !mkdir($thumbnailsPath)) {

           return array($upload_err, 'Upload Error: mkdir().');

       }

   }

   $imagesPath     = realpath($imagesPath);
   $thumbnailsPath = realpath($thumbnailsPath);

   // Is it ok to only check for the child directory?
   if ( FALSE !== $thumbnailsPath && is_dir($thumbnailsPath) ) {

       if (isset($files['file'])) {

           $tmp_name   = $files['file']['tmp_name'];
           $img_size   = $files['file']['size'];

           // At least 1 image
           if ($test == 'new' && $tmp_name[0] == '') {

               $upload_err = TRUE;
               return array($upload_err, '¡La primera imagen es necesaria!');

           }

           for($i = 0; $i < count($tmp_name); $i++) {

               if ($tmp_name[$i] != '') {

                   if ($img_size[$i] <= 7340032) {

                       $img_name       = '/' . ($i + 1) . '.jpg';
                       $thumbnail_name = '/thumbnail_' . ($i + 1) . '.jpg';

                       list($width, $height) = getimagesize($tmp_name[$i]);

                       if ($width >= 1100 && $height >= 650) {

                           $img    = imagecreatefromjpeg($tmp_name[$i]);
                           $img_p  = imagecreatetruecolor(1100, 650);
                           imagecopyresampled($img_p, $img, 0, 0, 0, 0, 1100, 650, $width, $height);
                           imagedestroy($img);
                           $img_t  = imagecreatetruecolor(180, 180);
                           imagecopyresampled($img_t, $img_p, 0, 0, 0, 0, 180, 180, 1100, 650);

                           if (!imagejpeg($img_p, $imagesPath . $img_name, 70) || !imagejpeg($img_t, $thumbnailsPath . $thumbnail_name, 70)) {

                               $upload_err = TRUE;
                               return array($upload_err, 'Error al subir la imagen (' . $files['file']['name'][$i] . ')');

                           } else $log .= 'IMG: ' . $img_name . ' (original name: ' . $files['file']['name'][$i] . ') uploaded successfully.' . "\n";

                           imagedestroy($img_p);
                           imagedestroy($img_t);

                       } else {
                           $upload_err = TRUE;
                           return array($upload_err, 'La imagen: ' . $files['file']['name'][$i] . ' debe tener como mínimo 1100px de ancho y 650px de alto.');
                       }
                   } else {
                       $upload_err = TRUE;
                       return array($upload_err, 'La imagen (' . $files['file']['name'][$i] . ') pesa más de 7 MB.');
                   }
               }
           }
       } else return array($upload_err, '$files[\'file\'] is not set:' . "\n" . var_dump($files['file']) . "\n" . 'Property ID: ' . $this->id);
   } else return array($upload_err, '$thumbnailsPath is false and/or not a dir: ' . $thumbnailsPath . '". Property ID: ' . $this->id);

   return $log;

}


Cualquier surgerencia es bienvenida. Gracias!
#25
En todo desarrollo llega la hora en la que nos preguntamos de qué manera hacer nuestra aplicación más eficiente, hacer las cosas de manera que suponga la menos carga posible para el servidor.

Actualmente estoy seleccionando y mostrando; a veces es una sola fila y otras hay un limite, pero hay un apartado en el que envio todas las filas al plugin JQuery DataTables. Bueno, todas las filas pero no todas las columnas, solo las necesarias y la verdad es que tendrían que ser muchas filas (como 1000 aunque no tengo ni idea) para que empezase a afectar no solo al cliente, si no al servidor tambien cuando hayan varios usuarios pidiendo a la vez.

Me gustaría saber si realmente vale la pena cachear los datos y donde sería mejor, si en una clase de php, en memcached (es el que estoy usando) o incluso en el propio cliente (he leido algo pero no estoy seguro de si se puede hacer).

En el caso de usar una clase php para cargar todas las filas supongo que tendría que convertir la navegación de mi web a AJAX para no tener que recargar todas las filas cada vez (osea que no serviria de nada la clase).

¿Teneis alguna idea más?

Gracias!
#26
El otro dia se dió soporte al protocolo http/2 con apache "2.4.20 (Red hat)" en kloxo-mr7 pero al parecer no funciona, lo estoy probando en una de mis webs y no se activa (sigo viendo http/1.1.

¿Hay alguien usando http/2 con apache en CentOS? Si os funciona tal vez sea un fallo en la configuración del kloxo-mr 7 o alomejor es un problema del paquete o a saber que.

Por si os interesa, está funcionando perfectamente con nginx y nginx-proxy.

Gracias.
#27
PHP / volver a instanciar dentro de la clase
23 Mayo 2016, 03:06 AM
Tengo una pequeña duda sobre una clase. Me gustaría saber por qué es necesario volver a instanciar la clase para llamar a los setters y por qué se usa el while si hay un LIMIT 1 en la query además de que no veo necesidad para un array:

Código (php) [Seleccionar]
class myClass {

private $variable_1;
private $variable_2;
private $variable_3;

private function generate($myClass) {
   $this->variable_1 = $myClass->variable_1;
   $this->variable_2 = $myClass->variable_2;
   $this->variable_3 = $myClass->variable_3;
}

private function addInformation($stmt) {
   $i = 0;
   $stmt->bind_result($variable_1, $variable_2, $variable_3);

   while ($stmt->fetch()) {
       $arrayStaff[$i] = new myClass();
       $arrayStaff[$i]->setVariable1($variable_1);
       $arrayStaff[$i]->setVariable2($variable_2);
       $arrayStaff[$i]->setVariable3($variable_3);
       $i++;
   }

   return $arrayStaff;
}

public function StaffFromId($id) {
   $mysqli = $this->aet->getAetSql();
   $exit   = FALSE;

   if ($stmt = $mysqli->prepare("SELECT * FROM staff WHERE id = ? LIMIT 1")) {
       $stmt->bind_param('i', $id);
       $stmt->execute();
       $stmt->store_result();

       if ($stmt->num_rows === 1) {
           $arrayStaff = $this->addInformation($stmt);
           $this->generate($arrayStaff[0]);
           $exit = TRUE;
       }
   }

   return $exit;
}

public function setVariableX($variable_X) {
   $this->variable_X = $variable_X;
}

public function getVariableX() {
   return $this->variable_X;
}

}


Si no me equivoco lo siguiente también funciona y no hace falta tener 2 funciones que hacen lo mismo, no?

Código (php) [Seleccionar]
private function addInformation($stmt) {
   $stmt->bind_result($variable_1, $variable_2, $variable_3);

    $stmt->fetch();

   $this->setVariable1($variable_1);
   $this->setVariable2($variable_2);
   $this->setVariable3($variable_3);
}


O directamente:

Código (php) [Seleccionar]
$this->variable_1 = $variable_1;

Mi conocimiento todavia es limitado por lo que ¿hay alguna razón por la que se hizo eso asi? ¿Tal vez implementar más cosas que necesiten eso? La clase la hizo un amigo con el que no he podido volver a hablar.

Gracias!
#28
Cuando intento mostrar el contenido de una tabla, MySQL (MariaDB) devuelve el siguiente error:

CitarCan't create/write to file '/tmp/#sql_bd5_0.MAI' (Errcode: 13 "Permission denied")

El servidor tiene pocos dias creado, estaba funcionando bien desde el principio. Esta mañana cuando voy a acceder a la base de datos me encuentro con este de error.

¿Puedo darle simplemente chmod 777 al directorio /tmp o no es seguro?

¿O es mejor idea añadir el directorio a la configuración mysql? (Como se sugiere en la documentación)

[mysqld]
tmpdir=/tmp


Estoy usando Kloxo-mr7 en centos 6.7 y no encuentro el archivo, ¿alguien sabe donde está?

Gracias!
#29
Hola, estoy configurando por primera vez kloxomr7 en centos 6.7 (final) y estoy teniendo problemas con los usuarios de mysql... Se supone que con kloxo hay que configurar contraseñas y usuarios desde el panel web con el usuario admin, pero los usuarios de mysql (mariadb) creados desde kloxo no funcionan.

Para crear bases de datos hay que especificar un usuario, por ejemplo:

Base de datos: test
Usuario: test
Contraseña: laquesea123

Pero no me deja entrar, desde sqlyog community (mi pc) me dice acceso denegado y desde phpmyadmin (el vps) "Cannot log in to the MySQL server".

He intentado cambiar la contraseña root desde la opción "MySQL Password Reset" pero no importa cuantas veces la cambie, no puedo conectarme con el usuario root.

La opción "Database Admins" tampoco funciona, da igual que usuario y contraseña cree, tampoco me deja entrar. También he probado borrandolo y volviendolo a hacer...

El único usuario con el que puedo entrar es el mismo con el que entro al panel web kloxo, usuario admin. Y las bases de datos que puedo ver son las dos que hay por defecto (information_schema y test) y la primera creada, las demás no me aparecen y no hay forma de acceder a ellas...

¿Cual creeis que puede ser el problema? ¿Puede ser un problema de kloxo?

Gracias!


Edito: Al parecer la contraseña que cambio en a opción "Database Admins" funciona desde el ssh (mysql -uadmin -p) y desde phpmyadmin (vps) pero desde sqlyog community (mi pc) no funciona, es otra distinta, pero el usuario es el mismo ¿como es esto posible?
#30
Edito: Ahora el problema es que ocupa demasiado tiempo y se detiene la ejecución...

En el formulario permito subir como mucho 8 imagenes de 7MB máximo, así es como tengo configurado mi archivo .user.ini:

Código (php) [Seleccionar]
upload_max_filesize = 7M
post_max_size = 60M
memory_limit = 70M
max_execution_time = 60


Si intento subir 8 imagenes de 5.2MB se detiene la ejecución y da el error. Sin embargo se procesan 7 imagenes y sus 7 thumbnails (he probado comentando las lineas del thumbnail y tarda exactamente lo mismo, no hay diferencia entre crear las imagenes solo y creas ambos: las imagenes y thumbnails).
Si en lugar de 8 subo 7 (igual de 5.2MB) el script tarda, casi lo mismo, pero termina de ejeuctarse.

No soy un experto, pero a lo mejor mi script necesita mejorarse para reducir el tiempo... Este es parte del script que sube las imagenes:

Código (php) [Seleccionar]
$tmp_name   = $_FILES['file']['tmp_name'];
$img_size   = $_FILES['file']['size'];

for($i = 0; $i < count($tmp_name); $i++) {

   if ($tmp_name[$i] != '') {

       if ($img_size[$i] <= 7340032) {

           $imageInfo = getimagesize($tmp_name[$i]);
           $memoryNeeded = round(($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $imageInfo['channels'] / 8 + Pow(2,16)) * 1.65);

           if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded (integer) ini_get('memory_limit') *pow(1024, 2)) {
               ini_set('memory_limit', (integer) ini_get('memory_limit') + ceil(((memory_get_usage() + $memoryNeeded) - (integer) ini_get('memory_limit') * pow(1024, 2)) / pow(1024, 2)) . 'M');
           }

           $img_name   = '/' . ($i + 1) . '.jpg';
           $thumb_name = '/thumbnail_' . ($i + 1) . '.jpg';

           list($width, $height) = getimagesize($tmp_name[$i]);

           if ($width >= 1100 && $height >= 650) {

               $img    = imagecreatefromjpeg($tmp_name[$i]);
               $img_p  = imagecreatetruecolor(1100, 650);
               $img_t  = imagecreatetruecolor(180, 180);
               imagecopyresampled($img_p, $img, 0, 0, 0, 0, 1100, 650, $width, $height);
               imagecopyresampled($img_t, $img_p, 0, 0, 0, 0, 180, 180, 1100, 650);

               if (!imagejpeg($img_p, $realpath . $img_name, 70) || !imagejpeg($img_t, $realpath . $thumb_name, 70)) {

                   $upload_err = TRUE;
                   throw new Exception('Error al subir la imagen (' . $_FILES['file']['name'][$i] . ')');

               } else $log .= "\n" . 'IMG: ' . $img_name . ' (original name: ' . $_FILES['file']['name'][$i] . ') uploaded successfully.';

               imagedestroy($img);
               imagedestroy($img_p);
               imagedestroy($img_t);

           } else {
               $upload_err = TRUE;
               throw new Exception('La imagen: ' . $_FILES['file']['name'][$i] . ' debe tener como mínimo 1100px de ancho y 650px de alto.');
           }
       } else {
           $upload_err = TRUE;
           throw new Exception('La imagen (' . $_FILES['file']['name'][$i] . ') pesa más de 7 MB.');
       }
   }
}


$img_p es la imagen optimizada y $img_t es el thumbnail que necesito guardar tambien. No estoy seguro si hay alguna diferencia entre como esta ahora y llamar imagedestroy antes, por lo menos para la primera imagen que es la que pesa bastante (suelen pesar 4-6MB resolución 4k de la camara del movil/fotos).

Tal vez se puede optimizar mi script.

Gracias!
#31
Estoy empezando a migrar (en mysql) de utf8 a utf8mb4 y a la hora de que php muestre contenido con caracteres especiales/acentuados, estos son remplazados por una interrogación con fondo negro ( � ).

Me he asegurado de que todo esté correcto. La base de datos está usando utf8mb4 (todas las tables y columnas con tipo: text, varchar, etc). Los archivos .php todos usan utf-8 (trabajo con visual studio code y esto es por defecto) y los headers, tanto en php como en html, están puestos a utf8.

Despues de instanciar mysqli, cambio el charset de utf8 a utf8mb4:

Código (php) [Seleccionar]
$mysqli->set_charset('utf8mb4');

Pero si lo dejo en utf8 todo funciona correcto... Y por lo que he estado leyendo, eso no tiene sentido alguno... Ya que en php, la codificación utf8 es completa y soporta hasta 4 bytes pero en mysql utf8 solo soporta hasta 3, por eso si el charset es utf8 pero mysql trabaja con utf8mb4 tiene que hacer conversión y es una perdida de tiempo...

¿Donde creeis que puede estar el problema?
#32
Me acaba de dar cuenta de que uno de mis scripts no funciona correctamente. Se trata de 2 de las 3 listas que tengo para seleccionar provincia, ciudad y zona.

La primera lista al no ser dinamica simplemente uso change() para que select2 sepa que el valor ha cambiado y lo refleje (tanto el placeholder como el valor de la lista en sí).

En el caso de las otras dos listas, es algo increible... cada vez que refresco (F5) la página, estas dos listas hacen algo distinto... no sé si es porque son dinamicas, pero no funciona.

Buscando en google he visto que para estos casos se usa la función trigger('change'); y opcionalmente se vuelve a instanciar select2 en el elemento antes de cambiar el valor. Lo estoy haciendo pero sigue sin funcionar:

Tengo un botón para cada lista que muestra con un alert el valor actual de cada lista. La segunda lista a veces muestra el valor y otras no, la tercera siempre muestra 0...


  • El placeholder cambia (puedo ver el nombre de la ciudad/zona), pero al abrir la lista la opción seleccionada es la primera (valor 0).
  • En el caso de la tercera lista (zonas), a veces llega a no suceder absolutamente nada. Otras simplemente cambia el placeholder pero el valor sigue siendo 0.

Código (javascript) [Seleccionar]
$(function () {

   var province        = <?php echo $province?>,
       city            = <?php echo $city?>,
       zone            = <?php echo $zone?>;

   // province
   $('select[name="location[province]"]').val(province).change();

   // city
   content = '/get?op=1&id=' + province + '&list=1&admin=1';
   $('select[name="location[city]"]').load(content, function() {
       $(this).select2(); // reinstanciar el plugin
       $(this).val(city).trigger('change');
   });

   // zone
   content = '/get?op=1&id=' + city + '&list=2&admin=1';
   $('select[name="location[zone]"]').load(content, function() {
       $(this).select2();
       $(this).val(zone).trigger('change');
   });

});


Las tres variables están bien, abro el código fuente de la página y puedo ver que cada una tiene el número (entero).

¿Alguien sabe cual puede ser el problema?

Gracias!
#33
Estoy creando mi propio regex para validar emails pero no consigo hacer funcionar el límite de carácteres de los dos primeros grupos, el tercer grupo si que valida bien el máximo.

Código (php) [Seleccionar]
/^([\w]+(?:[\.\-][\w]+)*){1,64}@([\w]+(?:[\.\-][\w]+)*){1,64}\.([a-zA-Z]{2,7})$/

Si no me equivoco el error quiere decir que está mal optimizado y le da carga innecesaria al procesador, no?

Como se puede leer, lo que busco es que los guiones actuen de la misma manera que los puntos, que no se puedan poner delante ni detras, solo entre dos caracteres \w. Tanto para el nombre de usuario como para el nombre de dominio.

Gracias!
#34
PHP / regex para protegerse de varios ataques
19 Abril 2016, 00:15 AM
He estado leyendo sobre distintos tipos de ataques, sobre todo xss. En muchos sitios dicen que es bastente dificil protegerse de este tipo de ataques, sin embargo yo lo encuentro bastante facil:

input=<script>alert(/xss/);</script>
input=>"><script>alert("XSS")</script>&
input=etc...


Código (php) [Seleccionar]
echo preg_replace('/\W/', '', $_GET['input'])

Adios XSS... ¿Hay algún otro tipo de ataque que pueda pasar ese regex?

Tambien he leido sobre ataques con codificación utf-16, que no lo he entendido, pero si yo tengo el siguiente regex que permite caracteres internacionales como acentos ñ ç, etc, ¿sería vulnerable a algún tipo de ataque?

~[^\pL\d]+~u

¿De verdad es tan facil protegerse? No creo que se pueda hacer XSS sin los tags <>, comillas dobles " o los dos puntos : usados en otro lenguaje (que no recuerdo el nombre).

Gracias.
#35
Quiero crear un regex que me permita filtrar caracteres no deseados (para evitar ataques xss, php y sql) en jquery. Para ello estoy probando dos plugins: filter_input y keyfilter pero ambos me dan error al usar el regex que necesito.

Los caracteres a permitir serian alphanumericos (a-zA-z0-9), espacios (a ser posible solo 1 entre caracteres) y los siguientes: ". : , - + ¿? ¡! ' ñ ç" y vocales con acentos y dieresis (pero no por separado).

He encontrado varios regex pero en cuanto intento añadir algún caracter de los arriba mencionados me da un error y no lo toma, ocurre con ambos plugins...

La idea es permitir elegir que caracteres especiales usar para cada input y luego usarlo en php con preg_replace por si se manipula el javascript.

¿Alguna idea de por qué esos dos plugins no aceptan regex con esos carácteres?

Tampoco es que tenga mucha idea de regex, a lo mejor lo estoy haciendo mal, pero otros los he sacado de respuestas que están funcionando, no sé...

Gracias!
#36
Tengo un script que sube datos a diferentes tablas mysql y necesito que si un insert falla, no se haga ninguno. Para ello he estado leyendo y creo tener una idea clara:

Código (php) [Seleccionar]
$mysqli = new mysqli(/* datos de conexión */);
$mysqli->autocommit(FALSE);

// el rollback lo dejará todo como estaba aquí
$mysqli->begin_transaction();

if ($stmt_uno = $mysqli->prepare('INSERT INTO tabla_principal (uno, dos, tres) VALUES (?, ?, ?)')) {
   $stmt_uno->bind_param('sss', $uno, $dos, $tres);
   $stmt_uno->execute();

   $id = (int) $mysqli->insert_id;

   if ($stmt_dos = $mysqli->prepare('INSERT INTO sub_tabla (principal_id, cuatro) VALUES (?, ?)')) {
       $stmt_dos->bind_param('is', $id, $cuatro);
       $stmt_dos->execute();
   }

   if ($stmt_tres = $mysqli->prepare('INSERT INTO sub_tabla_dos (principal_id, cinco) VALUES (?, ?)')) {
       $stmt_tres->bind_param('is', $id, $cinco);
       $stmt_tres->execute();
   }
}


if ($mysqli->commit()) {
   // todo correcto, se redirige
   header('Location: /');
} else {
   // algo ha salido mal, se llama rollback
   $mysqli->rollback();
   // y se muestra un mensaje de error
}


Todavía no lo he probado, pero no estoy seguro de si es así o hay que comprobar cada execute()...

¿Alguien puede corregirme?

Gracias!

Edito: cambio la estructura, el resto de inserts dependen del primero, pero si cualquiera falla no debe insertarse nada.
#37
PHP / sistema de visitas (contador)
8 Abril 2016, 03:52 AM
Necesito crear un sistema de visitas que cuente las visitas a ciertas páginas de mi web (algo asi como el contador de visitas de los videos de youtube), pero no busco nada exacto o estricto (como comprobar que el mismo usuario se conecta desde otro navegador distinto), pero un mínimo de integridad para que no se hagan trampas.

Más que nada lo que necesito es un poco de orientación ya que no tengo ni idea de como hacer esto, me refiero a la manera de "contar" cada vez que la página en cuestión carga, si limitar por ip o "unique brower id" y por tiempo; las visitas cuentan 1 vez al dia, cada hora, etc... ¿Qué es lo más común para mostar a los visitantes cuantas veces se ha visto dicha página?

Sobre el tema de la privacidad (por la necesidad de identificar al usuario), decir que en un principio esta información se debería usar única y exclusivamente en el servicio ofrecido por la web en cuestión y en caso de ofrecer servicios extra como: contenido favorito, reciente, etc pues al visitar la página por primera vez (o si se borran las cookies) está el aviso que informa del uso y si se acepta perfecto y si no también (la web sigue funcionando pero sin ofrecer dichos servicios extra). Lo comento porque soy el primero en contra de ciertas practicas abusivas, sucias y rastreras...

He estado buscando y leyendo sobre el tema, diferencias sobre "pageviews" y "hits" y más o menos eso está claro, pero sigo dudando sobre la manera de hacer esto. También he leido en un mensaje más abajo sobre "browser fingerprinting" que es sobre lo que me he estado informando un poquito, pero me queda una gran duda:

Yo genero el identificador unico basado en la informacion del navegador, pero si se conecta otro navegador con la misma información que pasa? Mismo navegador, sistema operativo, resolución, drivers gráficos, zona horaria, etc... aun que no lo parezca es información que se puede repetir varias veces por lo que da la sensación de no ser adecuado.

Por otra parte he leido sobre usar el elemento canvas de html5, y bueno, la duda sigue quedando: una vez generado el identificador, ¿como hago para compararlo con el navegador que acceda a mi página?

Una vez la idea está clara, implementar un sistema es de lo más sencillo y divertido  :)

Gracias!
#38
Hola buenas, estoy teniendo complicaciones para configurar las tablas de mi base de datos y poder trabajar correctamente con la aplicación web php.

Por ejemplo, en un INSERT que hago a X tabla, algunas variables pueden no existir (!isset) por lo que mysql debería introducir en el campo el valor default que se le especifica a la columna cuando se crea la tabla.

Yo uso sqlyog community para crear y gestionar las tablas, y las columnas que pueden ser opcionales les puse un valor default para que no se quede (NULL) y no haya problemas al hacer los select y comprobar el valor. Al principio probé activando la opción "Not Null?" pero al parecer si la variable a insertar no existe da error (diciendo que no puede ser null) pero debería usar el default. Probé desactivando dicha opción pero nada, se sigue quedando la columna (NULL) cuando se insertan variables opcionales que no están declaradas.

¿Cual creeis que puede ser el problema? A lo mejor me creo que el default sirve para esto pero resulta que es para otra cosa (aunque no lo creo)...

Gracias!
#39
Hola, estoy intentando crear un script que declare y limpie las variables de formularios largos, donde hayan arrays de numeros y strings, pero utilizando un whitelist para los nombres de los elementos. Me están dando errores:

CitarWarning: Illegal string offset 'name' in /home/aet/website.com/pages/upload.php on line 34

Notice: Undefined variable: a in /home/aet/website.com/pages/upload.php on line 34
Y
CitarWarning: Illegal string offset 'name' in /home/aet/website.com/pages/upload.php on line 38

Notice: Undefined variable: a in /home/aet/website.com/pages/upload.php on line 38

De momento esto es lo que tengo:

Código (php) [Seleccionar]
$list = array('name' => 'mandatory', 'surname' => 'optional');

foreach ( $list as $name => $nouse ) {
   if (isset($_POST[$name])) {
       if ( is_array($_POST[$name]) ) {
           $$name = filter_input( INPUT_POST , $name , FILTER_SANITIZE_STRING , FILTER_REQUIRE_ARRAY );
           foreach ($$name as $key => $value) {
               $key = preg_replace('[a-z]', '', $key);
               if ( is_numeric($$name[$key]) ) { // this is line 34
                   $$key = (int) $$name[$key];
                   echo $report[$key] = $key . ' variable (from ' . $name . ' ) created1... <span style="color:green;">OK!</span><br>';
               } else {
                   $$key = $$name[$key];  // this is line 38
                   echo $report[$key] = $key . ' variable (from ' . $name . ' ) created2... <span style="color:green;">OK!</span><br>';
               }
           }
       } else {
           if ( is_numeric($_POST[$name]) ) {
               $$name = filter_input( INPUT_POST , $name , FILTER_SANITIZE_NUMBER_INT );
               echo $report[$name] = $name . ' variable created3... <span style="color:green;">OK!</span><br>';
           } else {
               $$name = filter_input( INPUT_POST , $name , FILTER_SANITIZE_STRING );
               echo $report[$name] = $name . ' variable created4... <span style="color:green;">OK!</span><br>';
           }
       }
   } else {
       if ($list[$name] == 'optional') {
           $$name = 0;
           echo $report[$name] = $name . ' (optional) variable not filled5... <span style="color:green;">OK!</span><br>';
       } else die('Error: You must fill all mandatory fields! (' . $name . ')');
   }
}


El html es de lo más sencillo, los arrays los tengo asi:

Código (html5) [Seleccionar]
<input type="text" name="address_book[name]" />
<input type="text" name="address_book[surname]" />


¿Alguna idea de por qué no funciona?  :-\

Gracias!
#40
Hola, me ha pasado algo realmente raro y no consigo encontrar el problema.

Tengo una clase para los usuarios de una web, en esta clase tengo una funcion que devuelve el valor de una de las columnas de la tabla. Al principio todo funcionaba, pero tuve que añadir más columnas a la tabla y cambiar el nombre de un par de ellas, desde entonces hay una de las funciones (una de las dos a las que les tuve que cambiar el nombre) que no devuelve nada, las demás si que funcionan.

He comprobado varias veces por si fuera un error al escribir el nombre, pero todo parece estar en orden.

He grabado un video donde se puede ve claramente el código y el formulario donde se llama dicha función que debería imprimir el contenido de la columna pero nada...
#41
Redes / acceder al servidor web de un router
22 Marzo 2016, 12:21 PM
Hola, tengo router nuevo y al parecer no permite usar ciertos caracteres especiales ( / * ( ) ) en la contraseña del wifi. El problema es cuando le doy a aplicar cambios, da un mensaje de error:
Citar"" is invalid

Me pregunto si hay alguna manera de acceder al servidor web, donde se encuentra la página de configuración del router y la base de datos, para de esta manera, localizar donde está el fallo y tratar de solucionarlo.

Ya he avisado al ISP y me han dicho que ya tenian constancia de ello por lo que seguramente el problema ha estado presente desde el principio... ¿Se puede jdr algo asi por mejoras al router? Yo, como programador web lo dudo mucho, además de ser cosas totalmente distintas (la página de configuración y el sistema operativo).

Gracias!
#42
Redes / configurar asus RT-N12D1 en modo AP
8 Febrero 2016, 18:52 PM
Hola buenas, tengo que configurar este router para que haya wifi en el piso de arriba, el problema es que cuando lo configuro en modo AP (contectado mediante ethernet al router principal) la IP de configuración de este router asus deja de funcionar, solo aparece este mensaje por ethernet (por wifi ni se conecta). La IP del router principal funciona correctamente.

CitarSettings have been updated. Web page will now refresh.
Changes have been made to the IP address or port number. You will now be disconnected from RT-N12D1.
To access the settings of RT-N12D1, reconnect to the wireless network and use the updated IP address and port number.

Esto es lo que aparece cuando termino de configurar el router en modo AP. La primera vez no le cambie la IP (la deje en 192.168.1.1, la misma que la del router principal), pero lo he vuelto a intentar, antes de ponerlo en modo AP le he cambiado la ip a 192.168.1.2 y estaba funcionando perfectamente hasta que lo cambie a punto de acceso.

Ya no es solo que no puedo entrar a la configuración, es que no puedo navegar correctamente, he probado dos navegadores distintos (edge y firefox) y con ambos me da un problema de certificado cuando me conecto por wifi, por cable no tengo este problema. Tengo un portatil nuevo (con windows 10) y lo estoy probando con el wifi y me da el problema de certificado en paginas como google.es o mozilla.com.

¿Hay alguna manera de configurarlo correctamente? El wifi del router principal no llega donde quiero poner este router de asus, pero hay un cable ethernet que llega donde quiero ponerlo.

Gracias.
#43
Me gustaría hacer funcionar correctamente el buscador y de paso optimizar la tabla, pasar de server side a client side. Como no tengo idea de como funciona el client side de datatables pues active la opción para scriptearlo con php.

"El problema" si es que se le puede llamar así, es que no almaceno strings en la tabla a buscar, en lugar uso enteros para trabajar y luego con php muestro los strings desde otras tablas. Entonces, actualmente estoy usando joins (unos 5) entonces si quiero buscar tiene que ser con enteros (y eso no es profesional, el cliente y los usuarios tienen que poder buscar por el nombre...).

Un simple select a la tabla de la db devolveria enteros, menos un texto largo (descripción). ¿Hay alguna manera, al usar datatables en modo clientside, de acceder a las tablas donde están los nombres asociados a los enteros? O es mejor crear un objeto manualmente con los nombres?

Así es como lo inicializo:

Código (javascript) [Seleccionar]
$('#example').DataTable( {
   processing: true,
   serverSide: true,
   lengthChange: false,
   ajax: '/get?op=2',
   language: {
       "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Spanish.json"
   },
   columns: [
       { data: 'id' },
       { data: 'test' }
   ],
   select: true
});


¿Sería muy dificil hacer esto?

Gracias!
#44
Llevo un buen rato comiendome la cabeza y volviendome loco porque estoy intentando coger un valor del objeto para usarlo en un boton de la tabla. Necesito coger el id de la fila seleccionada (la primera columna y posición en el objeto).

Así inicializo datatables:

Código (javascript) [Seleccionar]
var table = $('#example').DataTable( {
   serverSide: true,
   dom: 'Bfrtip',
   ajax: '/get?op=2',
   columns: [
       { data: 'id' },
       // more columns
   ],
   buttons: [
       {
           text: 'New',
           action: function ( e, dt, node, config ) {
               window.location.href = '/url?op=new'
           }
       },
       {
           text: 'Modify',
           action: function ( e, dt, node, config ) {
               window.location.href = '/url?op=modify&id=' + dt.row( { selected: true } ).id() )
           },
           enabled: false
       },
       {
           text: 'Delete',
           action: function ( e, dt, node, config ) {
           },
           enabled: false
       }
   ],
   select: true
} );


Según la documentación asi es como se cogen los datos... He probado de varias maneras, usando un alert():

Código (javascript) [Seleccionar]
alert( dt.row( { selected: true } ).id() );  // undefined
alert( JSON.stringify(dt.row( { selected: true } ).id()) );  // "undefined"
alert( JSON.stringify(dt.row( { selected: true } ).data()[0]) );  // undefined


Lo raro es que si que puedo acceder al objeto y ver todo lo que tiene...

Código (javascript) [Seleccionar]
alert( JSON.stringify(dt.row( { selected: true } ).data()) );
// {"id":1,"key":"value","etc":"etc"}


¿Alguna idea?  :huh:

Edito: Solucionado:


Código (javascript) [Seleccionar]
var rw = dt.rows({ selected: true }).data()[0];
alert(rw.id);  // 1
#45
Hola que tal! Necesito crear un formulario que previsualice las imagenes subidas usando el plugin ezdz. El problema es que tengo varios file inputs y tengo que hacerle un loop a "preview" para pasarle la dirección de cada imagen y que muestre cada una en un file input.

Código (javascript) [Seleccionar]
$('input[type="file"]').ezdz({
    text: 'Arrastrar imagen',
    preview:'url/or/path/to/image.jpg',
});


Para un solo file input serviria así, pero tengo varios y cada uno debe tener una imagen.

He creado un script php que recoge la información de las imagenes (nombre, tamaño, etc) del directorio donde están y codifica los datos en json. Con ajax recojo la info para guardarla en un objeto javascript. A partir de aquí es donde tengo dudas, porque no sé como hacerle un loop a "preview".

Este es el script del ezdz.preview:

Código (javascript) [Seleccionar]
// Inject a file or image in the preview
$.ezdz.prototype.preview = function(path, callback) {
    var settings  = this.settings,
        $input    = this.$input,
        $ezdz     = $input.parent('.' + settings.classes.main),
        basename  = path.replace(/\\/g,'/').replace( /.*\//, ''),
        formatted = settings.format(basename);

    var img = new Image();
    img.src = path;

    // Is an image
    img.onload = function() {
        $ezdz.find('div').html($(img).fadeIn());

        if ($.isFunction(callback)) {
             callback.apply(this);
        }
    };

    // Is not an image
    img.onerror = function() {
        $ezdz.find('div').html('<span>' + formatted + '</span>');

        if ($.isFunction(callback)) {
             callback.apply(this);
        }
    };

    $ezdz.addClass(settings.classes.accept);
};


Gracias!