Hubo un error HTTP inesperado durante la petición API

Ayer en mi trabajo quise subir un plugin en el blog de la empresa, que está hecho en WordPress, y me tiró un error inesperado:

Hubo un error HTTP inesperado durante la petición API

Googleando encontré la solución y quiero compartirla:

Hay que editar http.php en wp-includes en las versión anteriores a la 3.0, y en class-http.php en versiones superiores a la 3.0, en la línea donde dice

'timeout' => apply_filters( 'http_request_timeout', 5);

hay que poner

'timeout' => apply_filters( 'http_request_timeout', 30);

Solo hay que cambiar el valor “5″ por “30″, pero al parecer solo sirve para las versiones anteriores a 3.0.

La solución concluye en editar el archivo plugin-install.php que se encuentra en wp-admin/includes y cambiar el valor 15 por 60 en la siguiente línea:

$request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'timeout' => <strong><span style="color: #ff0000;">15</span></strong>, 'body' => array('action' => $action, 'request' => serialize($args))) );

Doy fe que funciona !! :)

via Sarpanet.net

VN:F [1.9.12_1141]
Rating: 4.3/5 (6 votes cast)
VN:F [1.9.12_1141]
Rating: +5 (from 5 votes)

Detectar Bot con PHP

En mi trabajo estoy desarrollando una versión nueva del sitio y la semana que viene voy a realizar un pre-lanzamiento en la que van a convivir los dos sitios, el actual y la nueva versión, redireccionando a los usuarios a un sitio o al otro.

Hablando con expertos de SEO, me dijeron que la redirección tiene que ser del tipo Redirect 302 porque sino Google podría detectar contenido duplicado, además también hacer que los bots no vean el otro sitio.

Se me ocurrió esto:

<?php
$SEARCH_ENGINES_UA = "Googlebot|Yahoo|msnbot";
if (preg_match("/$SEARCH_ENGINES_UA/", $_SERVER['HTTP_USER_AGENT']) > 0)
{
 	// Bot
 	header('HTTP/1.1 302 Found');
 	header("Location: http://www.othersite.com/");
 	exit();
}
else
{
 	// Human Being
 	echo 'You are Human!';
}
?>

Para probar que esto realmente funciona, si lo prueba uno, siempre vas a ver el mensaje “You are Human!”, pero si querés ver lo que sucede si fueras un Bot, tendrías que instalarte un Plugin de Firefox para poder simular ser un Bot.

VN:F [1.9.12_1141]
Rating: 5.0/5 (4 votes cast)
VN:F [1.9.12_1141]
Rating: +4 (from 4 votes)

PHP: Filtrado de datos de Entrada y Salida

Las validaciones se implementan sobre la base de reglas: si un dato cumple con determinadas pruebas, es valido, caso contrario, debe producirse un corte en la ejecución del script e informar lo sucedido al usuario.

filtrado

PHP provee una serie de funciones para escapar datos:

htmlentities: convierte caracteres especiales a las entidades HTML correspondientes. Recibe como argumentos la cadena por convertir, el tratamiento que se dará a las comillas simples y dobles (opcional, ENT_COMPAT para convertirlas las dobles y preservar las simples, ENT_QUOTES para convertir ambas y ENT_NOQUOTES para preservarlas, por defecto ENT_COMPAT), y luego el juego de caracteres (opcional).

Si por ejemplo alguna de las variables tenía contenido javascript malisioso, esto evitará que el navegador lo interprete como tal:

$cad = '';

echo htmlentities($cad);

La salida sería:

&lt;script language=”javascript”&gt;//codigo&lt;/script&gt;

Podemos obtener la traducción completa a partir de la funcion get_html_translation_table (utilizando la constante HTML_ENTITIES), que devuelve un array con los caracteres origen y destino:

echo '
';
print_r(get_html_translation_table(HTML_ENTITIES));
echo '

';

La función html_entity_decode produce el efecto inverso: convierte desde entidades hacia los caracteres correspondientes y recibe los mismos argumentos, es decir, posee la misma interfaz que el método anterior.

La función htmlspecialchars es idéntica a htmlentities sólo que traduce ciertos caracteres especiales de Internet: ampersand (& por &amp;), comillas dobles ( por &quot;), comillas simples ( por &#039;), menor que (< por &lt;) y mayor que (> por &gt;). Recibe los mismos argumentos.

La traducción completa la podemos obtener a partir de la función get_html_translation_table (utilizando la constante HTML_SPECIALCHARS), que devuelve un array con los caracteres de origen y destino:

echo '
';
print_r(get_html_translation_table(HTML_SPECIALCHARS));
echo '

';

Más información | PHP

VN:F [1.9.12_1141]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.12_1141]
Rating: +2 (from 2 votes)

MySql: Seguridad en Base de Datos

A pesar de que las bases de datos poseen sus propios sitemas de seguridad, los scripts PHP pueden llegar a ser una entrada si no se toman las precauciones necesarias.

Un caso importante es el de los datos de conexión. Normalmente, una conexión es utilizada en todo el sitio, lo que supone centralizar los datos de conexión (nombre de usuario, contraseña, nombre del servidor, puerto, nombre de la base de datos, etc) en un mismo archivo que debería estar ubicado por fuera del DocumentRoot. De ésta manera no se podrá acceder a ese archivo a través del navegador de ninguna manera.

Otro método de acceso a la base de datos es a través del SQL injection, que consiste en incluir en las partes variables de una instrucción SQL valores que la modifiquen. Este acceso se hace a través de formularios.

Ejemplo:

Envío de datos desde un formulario a través del método POST

User: Password:
include '/config/conexion.php';

$rs = mysql_query("SELECT * FROM usuarios WHERE username = '$POST[username]' AND passowrd = '$POST[password]'");

if (mysql_num_rows($rs)) {
//succes
}
else {
//error
}

Es una consulta típica. Si completáramos el primer campo del formulario con algo como:

xxx' or 1 = 1

La sentencia final del SQL sería:

select * from usuarios where username = 'xxx' or 1 = 1 --' and password = ''

La cadena — indica el comienzo de un comentario en MySQL, por lo tanto, lo que el motor evaluará finalmente es:

select * from usuarios where username = 'xxx' or 1 = 1

La segunda condición siempre se cumple, por lo que siempre se ingresa al sistema.
Hay muchas maneras de realizar este tipo de ataques, que pueden ser neutralizados filtrando las variables de la consulta con la función mysql_real_escape_string (disponible únicamente para MySQL):

$username = mysql_real_escape_string($_POST[username]);
$password = mysql_real_escape_string($_POST[password]);
...
...
select * from usuarios where username = 'xxx\' or 1 = 1 --' and password = ''

En el próximo post voy a hablar sobre cómo filtrar datos de entrada y salida. La importancia de la validación de datos que ingresan a la aplicación desde el exterior, como el envío de formularios, carga de archivos o el acceso a servicios web.

VN:F [1.9.12_1141]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.12_1141]
Rating: +2 (from 2 votes)