Ejemplo # 1
public string test0(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
var values = new Dictionary<string, string>
{
//{ "cCarpetaDestino", cCarpetaDestino },
{ "cer", fileCer },
{ "key", fileKey},
{ "pass", textPwd}
};
var content = new FormUrlEncodedContent(values);
using (var httpClient = new HttpClient())
{
try
{
var response = httpClient.PostAsync(apiAddresswsFIRValidaClave, content).Result;
var responseString = response.Content.ReadAsStringAsync();
if (!oSrvSetting.ControlMEnsajeError(responseString.Result.ToString(), errors_DefUnion))
{
result = responseString.Result;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
return result;
}
Ejemplo # 2
public string test1(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
string result = string.Empty;
var values0 = new Dictionary<string, string>
{
//{ "cCarpetaDestino", cCarpetaDestino },
{ "cer", fileCer },
{ "key", fileKey},
{ "pass", textPwd}
};
var values = new Dictionary<string, string>();
//values.Add("cCarpetaDestino", cCarpetaDestino);
values.Add("cer", fileCer);
values.Add("key", fileKey);
values.Add("pass", textPwd);
using ( HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.PostAsync(apiAddresswsFIRValidaClave, new FormUrlEncodedContent(values0)).Result;
var tokne = response.Content.ReadAsStringAsync().Result;
result = tokne;
}
return result;
}
Ejemplo # 3
public string test2(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
string result = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(apiAddresswsFIRValidaClave);
// Header
request.ContentType = "text/javascript; charset=ISO-8859-1";
request.Method = "POST";
//request.AllowAutoRedirect = false;
//request.KeepAlive = false;
//request.Timeout = 30000;
//request.ReadWriteTimeout = 30000;
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36";
request.Accept = "application/json, text/javascript, */*";// "application/json";
request.ProtocolVersion = HttpVersion.Version11;
//request.Headers.Add("Accept-Language", "de_DE");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string postData = "cer=" + fileCer + "&key=" + fileKey + "&pass=" + textPwd;// + "&cCarpetaDestino="+cCarpetaDestino;
byte[] bytes = Encoding.UTF8.GetBytes(postData);
request.ContentLength = bytes.Length;
using (var writer = request.GetRequestStream())
{
writer.Write(bytes, 0, bytes.Length);
writer.Flush();
writer.Close();
}
var httpResponse = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var jsonReturn = streamReader.ReadToEnd();
result = jsonReturn;
}
return result;
}
Ejemplo # 4
public string test3(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
string result = string.Empty;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var builder = new UriBuilder(apiAddresswsFIRValidaClave);
var query = HttpUtility.ParseQueryString(builder.Query);
//query["cCarpetaDestino"] = cCarpetaDestino ;
query["cer"] = fileCer ;
query["key"] = fileKey ;
query["pass"] = textPwd ;
builder.Query = query.ToString();
string url = builder.ToString();
var resultTask = Task.FromResult(client.GetAsync(url).Result).Result.Content;
var resultJson = resultTask.ReadAsStringAsync().Result;
result = resultJson.ToString();
}
return result;
}
Ejemplo # 5
public async Task<string> test4Async(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
string result = string.Empty;
var values = new Dictionary<string, string>
{
// { "cCarpetaDestino", cCarpetaDestino },
{ "cer", fileCer },
{ "key", fileKey},
{ "pass", textPwd}
};
using (var client = new HttpClient())
{
var content = new StringContent(JsonConvert.SerializeObject(values), Encoding.UTF8, "application/json");
var resultAsync = await client.PostAsync(apiAddresswsFIRValidaClave, content);
return await resultAsync.Content.ReadAsStringAsync();
}
}
Ejemplo # 6
public string test5(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
string result = string.Empty;
string WEBSERVICE_URL = apiAddresswsFIRValidaClave;
//string jsonData = "{ \"cCarpetaDestino\" : \"" + cCarpetaDestino + "\", \"fileCer\":\""+ fileCer + "\", \"fileKey\":\"" + fileKey + "\", \"textPwd\":\"" + textPwd + "\" }";
string jsonData = "{ \"cer\":\"" + fileCer + "\", \"key\":\"" + fileKey + "\", \"pass\":\"" + textPwd + "\" }";
var values = new Dictionary<string, string>
{
//{ "cCarpetaDestino", cCarpetaDestino },
{ "cer", fileCer },
{ "key", fileKey},
{ "pass", textPwd}
};
string postData = "cer=" + fileCer + "&key=" + fileKey + "&pass=" + textPwd;// + "&cCarpetaDestino="+ cCarpetaDestino;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(WEBSERVICE_URL);
if (webRequest != null)
{
webRequest.Method = "POST";
webRequest.Timeout = 60000;
webRequest.ContentType = "application/json"; //"application/x-www-form-urlencoded"; //"application/json";
webRequest.Accept = "application/json,text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
/*
using (System.IO.Stream s = webRequest.GetRequestStream())
{
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(s))
sw.Write(jsonData);
}
using (System.IO.Stream s = webRequest.GetResponse().GetResponseStream())
{
using (System.IO.StreamReader sr = new System.IO.StreamReader(s))
{
var jsonResponse = sr.ReadToEnd();
result = jsonResponse.ToString();
System.Diagnostics.Debug.WriteLine(String.Format("Response: {0}", jsonResponse));
}
}*/
StreamWriter sw = new StreamWriter(webRequest.GetRequestStream());
sw.Write(postData, 0, byteArray.Length);
sw.Close();
//recuperamos la peticion y la mostramos
HttpWebResponse respuestaGalleta = (HttpWebResponse)webRequest.GetResponse();
StreamReader lectorGalleta = new StreamReader(respuestaGalleta.GetResponseStream());
result = lectorGalleta.ReadToEnd().ToString();
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
return result;
}
Ejemplo # 7
public string test6Async(string cCarpetaDestino, string fileCer, string fileKey, string textPwd)
{
string result = string.Empty;
// Create a request using a URL that can receive a post.
WebRequest request = WebRequest.Create(apiAddresswsFIRValidaClave);
// Set the Method property of the request to POST.
request.Method = "POST";
// Create POST data and convert it to a byte array.
string postData = "cer=" + fileCer + "&key=" + fileKey + "&pass=" + textPwd;// + "&cCarpetaDestino=" + cCarpetaDestino;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();
// Get the response.
WebResponse response = request.GetResponse();
// Display the status.
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
// The using block ensures the stream is automatically closed.
using (dataStream = response.GetResponseStream())
{
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Display the content.
Console.WriteLine(responseFromServer);
result = responseFromServer;
}
// Close the response.
response.Close();
return result ;
}
Ingeniero de Software
miércoles, 31 de julio de 2019
martes, 25 de junio de 2019
Gráficos SVG
Graficos SVG ó imágenes vectoriales
1- La principal ventaja de las imágenes vectoriales es que siempre mantienen la calidad y nitidez a cualquier resolución.
Las imágenes tradicionales que usan los formatos JPG, PNG, BMP, GIF y otros similares, son imágenes en mapa de bits, matriciales o rasterizadas.
Están formadas por una serie de pixeles o puntos coloreados y al redimensionarlas o aumentar el zoom se pixelizan y pierden calidad.
Las imágenes vectoriales contienen las instrucciones para el navegador o programa de visualización de cómo crear la imagen.
Es por eso que al aumentar el zoom siguen mostrándose nítidamente a cualquier resolución.
Se puede comprobar lo anterior con la siguiente imagen.
Es un logotipo de muestra creado en formato SVG usando InkScape. Mide 800 x 500 pixeles y solo 3 KB.
Da un clic encima de ella para abrirla en una nueva pestaña y entonces aumenta el zoom del navegador usando al mismo tiempo la teclas Control y + o - del teclado numérico.
2- Otra de las ventajas de las imágenes vectoriales es su pequeño tamaño, que permite aumentar la velocidad de carga de las páginas, sin prescindir de elementos gráficos o poder emplear mayor cantidad de ellos.
3- Las imágenes son construidas por el navegador, lo que disminuye la carga y consumo de recursos en el servidor web.
4- Se pueden crear imágenes SVG animadas.
Como crear las imágenes vectoriales SVG
Las imágenes SVG se pueden crear de dos formas:
1- Usando programas de diseño gráfico, como son Illustrator, Corel Draw, Freehand o Visio, no obstante el mejor de ellos es InkScape.
También es posible convertir otras imágenes vectoriales como las que usan el formato WMF al formato SVG.
Otra opción es convertir imágenes tradicionales de mapa de bits al formato SVG.
2- Cuando se trata de elementos sencillos, podemos crear las imágenes impregnando en la página web el código necesario para representarlas. Algunos ejemplos se muestran más abajo.
Para eso los más entusiastas pueden introducir el código directamente o copiar y pegar el código de una imagen existente creada mediante software.
También es posible convertir otras imágenes vectoriales como las que usan el formato WMF al formato SVG.
Otra opción es convertir imágenes tradicionales de mapa de bits al formato SVG.
2- Cuando se trata de elementos sencillos, podemos crear las imágenes impregnando en la página web el código necesario para representarlas. Algunos ejemplos se muestran más abajo.
Para eso los más entusiastas pueden introducir el código directamente o copiar y pegar el código de una imagen existente creada mediante software.
Los mejores programas para editar imágenes SVG
Para crear, editar y convertir otros formatos de imágenes a SVG, podemos usar programas, aplicaciones o servicios en la red.
Existen para la computadora programas muy completos y otros sencillos, dependiendo del propósito de cada persona.
Los más populares son los siguientes:
Adobe Ilustrator
Adobe Ilustrator, es un completo y complejo editor gráfico de imágenes vectoriales, en el que se pueden crear imágenes en formato SVG.Ha alcanzado una gran fama, debido a las composiciones creadas por artistas gráficos digitales usando esta herramienta, que es muy profesional.
Lamentablemente es un programa de pago.
Puede resultar un programa muy complejo para los que buscan crear gráficos sencillos.
InkScape
InkScape es una herramienta de código abierto y gratis.Se puede emplear para dibujar y crear imágenes vectoriales en la computadora.
Con esta aplicación podemos crear conjuntos impresionantes de forma fácil, más fácil aun si poseemos una Laptop con pantalla táctil.
Usando Inkscape para crear una imagen vectorial SVG.

Incluye diversas herramientas que facilitan la creación de imágenes vectoriales.
Muy útil es un tutorial básico (en español) incluido en el programa, al que se puede acceder desde el menú Ayuda, que nos introduce en el mundo vectorial.
Inkscape se puede descargar gratis en español desde http://www.inkscape.org/, también existen versiones portables que funcionan desde el USB.
SVG-Edit
SVG-Edit es un editor de imágenes SVG que se puede probar online y de quedar satisfecho descargar los archivos de la aplicación, para usarlo en la computadora.Es una aplicación web de código abierto que funciona usando el navegador ya sea desde internet o en el equipo de forma local.
Está disponible para descargar en Github.
Después de descargar el paquete de la aplicación descomprímelo y abre con el navegador el archivo "svg-editor.html" que se encuentra dentro de la carpeta "editor".
Usando SVG-Edit offline, un completo editor de imágenes SVG en el navegador Firefox, para crear la imagen de portada de este articulo.

El uso del programa es bastante sencillo.
De forma similar a Inkscape incluye herramientas para dibujar, crear formas básicas, rellenar, insertar texto y otras acciones.
Los objetos se van adicionando en capas diferentes.
Incluye una librería con varias formas, para temas y objetivos diferentes .
La imagen resultante se guarda en formato SVG o se puede exportar en otros formatos gráficos.
La aplicación está disponible en español.
Con SVG-Edit creamos la imagen de portada de este articulo y también el logo de nuestro sitio web.
Otros editores de imágenes vectoriales
Otros programas famosos para la creación y edición de imágenes vectoriales son: Sketch (solo disponible para el sistema operativo MacOS), Freehand, CorelDraw y Xara X.Minimizar y comprimir y optimizar las imágenes SVG
Las imágenes SVG al consistir en archivos de texto plano con código, se pueden minimizar y comprimir, de la misma forma que los archivos CSS o JavaScript.
Los editores de imágenes SVG siempre agregan código adicional y etiquetas, que son usadas para identificar elementos y editar estas imágenes.
Si vamos a usar las imágenes "inline", es decir impregnando su código en el HTML de las páginas y no referenciándolas del modo tradicional, necesitamos eliminar el código innecesario, porque además de ocupar espacio de forma innecesaria, puede hacer que las paginas no validen correctamente.
Para eso solo es necesario eliminar las etiquetas innecesarias y los saltos de líneas.
Esto anterior es lo que se conoce como optimizar las imágenes SVG.
Podemos hacerlo manualmente usando un editor o con uno de los servicios disponibles en internet.
Algunas de las etiquetas que se pueden eliminar son las siguientes:
id, inkscape:xxxxx, sodipodi:xxxxx, defs, metadata, rdf:xxxx, cc:Work, dc:xxxxx.
En el siguiente enlace se puede descargar un archivo que contiene dos imágenes SVG de ejemplo.La primera de ellas fue creada y guardada con el programa InkScape, la segunda la misma imagen después de optimizarla y eliminar el código innecesario, también se le adicionó un visor (viewBox).
Se puede comprobar que el navegador representa las dos de forma idéntica, pero la diferencia en el código es evidente.
Se pueden descargar y guardar las imágenes anteriores y comparar la gran diferencia en el código de ambas.
Servicios de internet para comprimir y minimizar SVG
Existen varios servicios para esta tarea.He usado los dos siguientes que recomiendo:
https://vecta.io/nano
https://www.svgminify.com/es.html
Convertir imágenes al formato SVG
Convertir imágenes en formato de mapa de bits a SVG es posible, pero generalmente no es factible.
Solo da resultado con imágenes PNG con transparencia y que sean bien sencillas.
De lo contrario la calidad es pésima y el tamaño excesivo.
Se debe tener en cuenta que la imagen correspondiente en formato SVG a una PNG, siempre debe ser menor de un 10% de su tamaño original.
Programas o servicios para convertir imágenes PNG a SVG
Al hacer una búsqueda en Google de servicios para convertir imágenes a SVG, nos encontramos con varios de ellos, que solo convierten las imágenes al formato base 64.
Base 64 no es una imagen SVG.
Podemos identificarla abriéndola con un editor o con el Blog de notas y comprobando que el código comienza con el siguiente formato:
data:;base64,RXN0YSBlcyBs
Lee más información: Como usar e insertar imágenes codificadas en base 64Solo algunos de estos servicios realizan la conversión correctamente, con la mayoría el resultado es pésimo.
Desgraciadamente la gran mayoría exige procesos de registro que todos tratamos de evitar, para prevenir el acoso a nuestra dirección de correo electrónico.
Hemos probado los siguientes servicios de internet que son gratuitos y no requieren de registro alguno.
Potrace
Potrace es una excelente herramienta gratis para convertir imágenes de mapa de bits a vectoriales, que funciona mediante la línea de comandos offline.Lamentablemente el resultado es solo en blanco y negro y solo admite imágenes de entrada en formatos PBM, PGM, PPM o BMP.
Incluye la utilidad mkbitmap que se puede emplear para filtrar las imágenes antes de convertirlas finalmente.
Es muy práctico para vectorizar imágenes escaneadas de dibujos o ilustraciones.
http://potrace.sourceforge.net/
Image2svg
Servicio para convertir imágenes al formato SVG, subiéndolas desde nuestro equipo.Se puede copiar el código resultante o descargar la imagen creada.
Image2svg
PickSVG
PickSVG es otro convertidor gratis online sin registro, con buenos resultados.https://picsvg.com/
lunes, 24 de junio de 2019
Hilo ASPX C#
[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Hilo() {
List<string> d = new List<string>();
d.Add(ShowTodaysInfo(100).Result);
return JsonConvert.SerializeObject(d, Formatting.Indented);
}
/**********************************************************/
private static async Task<string> ShowTodaysInfo(int Dato)
{
string ret = $"Today is {DateTime.Today:D}\n" +
"Today's hours of leisure: " +
$"{await GetLeisureHours(Dato)}";
return ret;
}
static async Task<int> GetLeisureHours(int dato)
{
// Task.FromResult es un marcador de posición para el trabajo real que devuelve una cadena.
var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString());
// El método entonces puede procesar el resultado de alguna manera.
int leisureHours;
if (today.First() == 'M')
leisureHours = 16;
else
leisureHours = 5;
leisureHours = dato;
for (int i = 0; i < 500; i++) {
leisureHours = leisureHours + 1;
}
return leisureHours;
}
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Hilo() {
List<string> d = new List<string>();
d.Add(ShowTodaysInfo(100).Result);
return JsonConvert.SerializeObject(d, Formatting.Indented);
}
/**********************************************************/
private static async Task<string> ShowTodaysInfo(int Dato)
{
string ret = $"Today is {DateTime.Today:D}\n" +
"Today's hours of leisure: " +
$"{await GetLeisureHours(Dato)}";
return ret;
}
static async Task<int> GetLeisureHours(int dato)
{
// Task.FromResult es un marcador de posición para el trabajo real que devuelve una cadena.
var today = await Task.FromResult<string>(DateTime.Now.DayOfWeek.ToString());
// El método entonces puede procesar el resultado de alguna manera.
int leisureHours;
if (today.First() == 'M')
leisureHours = 16;
else
leisureHours = 5;
leisureHours = dato;
for (int i = 0; i < 500; i++) {
leisureHours = leisureHours + 1;
}
return leisureHours;
}
miércoles, 8 de mayo de 2019
JAVASCRIPT POO
JAVASCRIPT POO
var misDatos = new Array();
function datos(cuestionario_idpregunta,cuestionario_pregunta,cuestionario_respuestas,cuestionario_tiemporespuesta,cuestionario_id,cuestionario_tiempoconsumido,cuestionario_codigo){
this.cuestionario_id = cuestionario_id;
this.cuestionario_idpregunta = cuestionario_idpregunta;
this.cuestionario_pregunta = cuestionario_pregunta;
this.cuestionario_respuestas = cuestionario_respuestas;
this.cuestionario_tiemporespuesta = cuestionario_tiemporespuesta;
this.cuestionario_tiempoconsumido = cuestionario_tiempoconsumido;
this.cuestionario_codigo = cuestionario_codigo;
}
misDatos[i++] = new datos("<?php echo $idpregunta; ?>","<?php echo $dato["descripcionp"]; ?><br>",objeto,"<?php echo $dato["tiempo_resolucion"] ?>","<?php echo $idcuestionario; ?>","0",'<?php echo $codigo; ?><br>');
alert(document.getElementById("cIdUsuarioemail").value);
alert($("#cIdUsuarioemail").attr("value"));
alert($("#cIdUsuarioemail").val());
var misDatos = new Array();
function datos(cuestionario_idpregunta,cuestionario_pregunta,cuestionario_respuestas,cuestionario_tiemporespuesta,cuestionario_id,cuestionario_tiempoconsumido,cuestionario_codigo){
this.cuestionario_id = cuestionario_id;
this.cuestionario_idpregunta = cuestionario_idpregunta;
this.cuestionario_pregunta = cuestionario_pregunta;
this.cuestionario_respuestas = cuestionario_respuestas;
this.cuestionario_tiemporespuesta = cuestionario_tiemporespuesta;
this.cuestionario_tiempoconsumido = cuestionario_tiempoconsumido;
this.cuestionario_codigo = cuestionario_codigo;
}
misDatos[i++] = new datos("<?php echo $idpregunta; ?>","<?php echo $dato["descripcionp"]; ?><br>",objeto,"<?php echo $dato["tiempo_resolucion"] ?>","<?php echo $idcuestionario; ?>","0",'<?php echo $codigo; ?><br>');
alert(document.getElementById("cIdUsuarioemail").value);
alert($("#cIdUsuarioemail").attr("value"));
alert($("#cIdUsuarioemail").val());
lunes, 22 de abril de 2019
Google - reCAPTCHA v3
Google ha lanzado reCAPTCHA v3 para evitar los robots de spam sin la interacción del usuario. reCAPTCHA v3 nos devuelve el puntaje de spam que se puede utilizar para realizar diversas acciones en su aplicación web.
Registre su sitio web y obtenga clave secreta
Lo primero que debe hacer es registrar su sitio web en Google reCAPTCHA para hacerlo, haga clic aquí.
Inicie sesión en su cuenta de Google y cree la aplicación rellenando el formulario. Seleccione el reCAPTCHA v3 y en esa opción de casilla de verificación "No soy un robot".
Credenciales
Una vez enviado, Google le proporcionará la siguiente información.
Clave del sitio
Llave secreta
Integra Google reCAPTCHA en tu sitio web.
Para integrarlo en su sitio web, debe colocarlo tanto en el lado del cliente como en el lado del servidor. En la página HTML del cliente, debe integrar esta línea antes de la etiqueta.
Nota:
Google reCAPTCHA v3 es invisible. No verás una forma de captcha de ningún tipo en tu página web. Necesitas capturar la respuesta de google captcha en tu código JavaScript. Aquí hay un pequeño fragmento.
Ícono reCAPTCHA
Esto generará un formulario y si se da cuenta, en la esquina derecha, verá un ícono reCAPTCHA de Google.
Como no tenemos un estilo de casilla de verificación, debemos capturar la respuesta de Google reCAPTCHA y enviarla al back-end para su verificación.
En el código, en el formulario de envío, obtenemos el token utilizando la función execute () de reCAPTCHA y pasamos el token junto con el correo electrónico y el comentario al código PHP, ASP mediante la función jQuery Ajax.
En el lado del servidor, vamos a usar PHP o ASP por ahora. Entonces, en la solicitud de envío de formulario, verificaremos la variable POST.
Ejecuta el código y rellena el formulario. Si Google no lo reconoce como un spammer, verá un cuadro de alerta que muestra el siguiente mensaje.
Realice la solicitud para verificar el token de respuesta como con reCAPTCHA v2 o Invisible reCAPTCHA. La respuesta es un objeto JSON:
{
"success": true|false,
"challenge_ts": timestamp, // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
"hostname": string, // the hostname of the site where the reCAPTCHA was solved
"error-codes": [...] // optional
}
namespace Clase.Object
{
public class ObjCaptcha
{
private string apiAddress = "https://www.google.com/recaptcha/api/siteverify";
private string recaptchaSecret = Properties.Settings.Default.RecaptchaPrivateKey;
public string RecaptchaVerify(string recaptchaToken)
{
string url = $"{apiAddress}?secret={recaptchaSecret}&response={recaptchaToken}";
using (var httpClient = new HttpClient())
{
try
{
string responseString = httpClient.GetStringAsync(url).Result;
return responseString;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
public class ResponseToken
{
public DateTime challenge_ts { get; set; }
public float score { get; set; }
public List<string> ErrorCodes { get; set; }
public bool Success { get; set; }
public string hostname { get; set; }
}
}
<script src="https://www.google.com/recaptcha/api.js?render=token_key"></script>
<script>
grecaptcha.ready(function () {
grecaptcha.execute(token_key, { action: 'homepage' }).then(function (token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
$.ajax({
type: 'POST',
url: 'Captcha',
data: "{'token':'" + token + "'}",
contentType: 'application/json; utf-8',
dataType: 'json',
success: function (data) {
if (data.d != null || data.d.Estatus != false) {
if (data.d.Estatus != false) {
}
} else {
}
},
error: function (jqXHR, textStatus, errorThrown) {
}
});
});
});
</script>
ObjCaptcha objCaptchas = new ObjCaptcha();
var responseString = objCaptchas.RecaptchaVerify(token);
ResponseToken response = new ResponseToken();
response = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseToken>(responseString.Result);
$email;$comment;$captcha;
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$comment = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);
$captcha = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING);
if(!$captcha){
echo '<h2>Please check the the captcha form.</h2>';
exit;
}
$secretKey = "-----put your secret here------";
$ip = $_SERVER['REMOTE_ADDR'];
// post request to server
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array('secret' => $secretKey, 'response' => $captcha);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$responseKeys = json_decode($response,true);
header('Content-type: application/json');
if($responseKeys["success"]) {
echo json_encode(array('success' => 'true'));
} else {
echo json_encode(array('success' => 'false'));
}
<html>
<head>
<title>Google recapcha v3 demo - Codeforgeek</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js?render=put your site key here"></script>
</head>
<body>
<h1>Google reCAPTHA Demo</h1>
<form id="comment_form" action="form.php" method="post" >
<input type="email" name="email" placeholder="Type your email" size="40"><br><br>
<textarea name="comment" rows="8" cols="39"></textarea><br><br>
<input type="submit" name="submit" value="Post comment"><br><br>
</form>
<script>
// when form is submit
$('#comment_form').submit(function() {
// we stoped it
event.preventDefault();
var email = $('#email').val();
var comment = $("#comment").val();
// needs for recaptacha ready
grecaptcha.ready(function() {
// do request for recaptcha token
// response is promise with passed token
grecaptcha.execute('put your site key here', {action: 'create_comment'}).then(function(token) {
// add token to form
$('#comment_form').prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
$.post("form.php",{email: email, comment: comment, token: token}, function(result) {
console.log(result);
if(result.success) {
alert('Thanks for posting comment.')
} else {
alert('You are spammer ! Get the @$%K out.')
}
});
});;
});
});
</script>
</body>
</html>
Interpretando la partitura
reCAPTCHA v3 devuelve una puntuación (1.0 es muy probable que sea una buena interacción, 0.0 es muy probable que sea un bot). En función de la puntuación, puede realizar acciones variables en el contexto de su sitio. Cada sitio es diferente, pero a continuación hay algunos ejemplos de cómo los sitios usan la puntuación. Como en los ejemplos a continuación, actúe entre bastidores en lugar de bloquear el tráfico para proteger mejor su sitio.
reCAPTCHA v3. olvídate de “No soy un robot”
Google ha presentado el nuevo reCAPTCHA v3, la evolución del método de identificación en la web más popular. Gracias a él millones de páginas web pueden saber que en ella está entrando un ser humano, y no un robot que pueda tener oscuras intenciones. Este CAPTCHA fue creado para poder cribar a aquellos usuarios que funcionaran de una manera mecánica, y poder distinguirlos de meras máquinas. Ahora con esta nueva versión, el método se ha vuelto más inteligente, y necesita de menos interacción por parte del usuario para que la web sepa que no es un proceso automático. Las siglas CAPTCHA quieren decir “Completely Automated Public Turing test to tell Computers and Humans Apart” ("Prueba de Turing pública completamente automatizada para diferenciar a las computadoras y los humanos") un proceso que hasta ahora necesitaba de que superáramos ciertas pruebas, como reconocer objetos, resolver fórmulas matemáticas sencillas, o bien seleccionar con un aspa el texto de “no soy un robot” algo que con la nueva versión se elimina por completo. Ya no tendremos que superar este tipo de pruebas para demostrar que somos una persona en lugar de un robot. Todo gracias a un nuevo algoritmo que es capaz de saber si estamos comportándonos como lo haría una persona, o bien como una máquina. Ahora, si el algoritmo nota algún tipo de anomalía en la actitud de quien está entrando en la web, activará de nuevo estas pruebas. De esta manera se evita ralentizar el proceso de visitar las páginas. En este algoritmo entran variables como el movimiento de nuestro ratón, o los tiempos entre las pulsaciones al ratón que hemos hecho en nuestras visitas a distintas webs, para valorar si somos una persona o una máquina. Google le ha declarado la guerra al bot, y este es uno gran ejemplo.Registre su sitio web y obtenga clave secreta
Lo primero que debe hacer es registrar su sitio web en Google reCAPTCHA para hacerlo, haga clic aquí.
Inicie sesión en su cuenta de Google y cree la aplicación rellenando el formulario. Seleccione el reCAPTCHA v3 y en esa opción de casilla de verificación "No soy un robot".
Credenciales
Una vez enviado, Google le proporcionará la siguiente información.
Clave del sitio
Llave secreta
Integra Google reCAPTCHA en tu sitio web.
Para integrarlo en su sitio web, debe colocarlo tanto en el lado del cliente como en el lado del servidor. En la página HTML del cliente, debe integrar esta línea antes de la etiqueta.
Nota:
Google reCAPTCHA v3 es invisible. No verás una forma de captcha de ningún tipo en tu página web. Necesitas capturar la respuesta de google captcha en tu código JavaScript. Aquí hay un pequeño fragmento.
Ícono reCAPTCHA
Esto generará un formulario y si se da cuenta, en la esquina derecha, verá un ícono reCAPTCHA de Google.
Como no tenemos un estilo de casilla de verificación, debemos capturar la respuesta de Google reCAPTCHA y enviarla al back-end para su verificación.
En el código, en el formulario de envío, obtenemos el token utilizando la función execute () de reCAPTCHA y pasamos el token junto con el correo electrónico y el comentario al código PHP, ASP mediante la función jQuery Ajax.
En el lado del servidor, vamos a usar PHP o ASP por ahora. Entonces, en la solicitud de envío de formulario, verificaremos la variable POST.
Ejecuta el código y rellena el formulario. Si Google no lo reconoce como un spammer, verá un cuadro de alerta que muestra el siguiente mensaje.
Respuesta API
Realice la solicitud para verificar el token de respuesta como con reCAPTCHA v2 o Invisible reCAPTCHA. La respuesta es un objeto JSON:
{
"success": true|false,
"challenge_ts": timestamp, // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
"hostname": string, // the hostname of the site where the reCAPTCHA was solved
"error-codes": [...] // optional
}
ASP
namespace Clase.Object
{
public class ObjCaptcha
{
private string apiAddress = "https://www.google.com/recaptcha/api/siteverify";
private string recaptchaSecret = Properties.Settings.Default.RecaptchaPrivateKey;
public string RecaptchaVerify(string recaptchaToken)
{
string url = $"{apiAddress}?secret={recaptchaSecret}&response={recaptchaToken}";
using (var httpClient = new HttpClient())
{
try
{
string responseString = httpClient.GetStringAsync(url).Result;
return responseString;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
public class ResponseToken
{
public DateTime challenge_ts { get; set; }
public float score { get; set; }
public List<string> ErrorCodes { get; set; }
public bool Success { get; set; }
public string hostname { get; set; }
}
}
Llamado ASP
<script src="https://www.google.com/recaptcha/api.js?render=token_key"></script>
<script>
grecaptcha.ready(function () {
grecaptcha.execute(token_key, { action: 'homepage' }).then(function (token) {
var recaptchaResponse = document.getElementById('recaptchaResponse');
recaptchaResponse.value = token;
$.ajax({
type: 'POST',
url: 'Captcha',
data: "{'token':'" + token + "'}",
contentType: 'application/json; utf-8',
dataType: 'json',
success: function (data) {
if (data.d != null || data.d.Estatus != false) {
if (data.d.Estatus != false) {
}
} else {
}
},
error: function (jqXHR, textStatus, errorThrown) {
}
});
});
});
</script>
ObjCaptcha objCaptchas = new ObjCaptcha();
var responseString = objCaptchas.RecaptchaVerify(token);
ResponseToken response = new ResponseToken();
response = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponseToken>(responseString.Result);
PHP
$email;$comment;$captcha;
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$comment = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);
$captcha = filter_input(INPUT_POST, 'token', FILTER_SANITIZE_STRING);
if(!$captcha){
echo '<h2>Please check the the captcha form.</h2>';
exit;
}
$secretKey = "-----put your secret here------";
$ip = $_SERVER['REMOTE_ADDR'];
// post request to server
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = array('secret' => $secretKey, 'response' => $captcha);
$options = array(
'http' => array(
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
$responseKeys = json_decode($response,true);
header('Content-type: application/json');
if($responseKeys["success"]) {
echo json_encode(array('success' => 'true'));
} else {
echo json_encode(array('success' => 'false'));
}
Llamado PHP
<html>
<head>
<title>Google recapcha v3 demo - Codeforgeek</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://www.google.com/recaptcha/api.js?render=put your site key here"></script>
</head>
<body>
<h1>Google reCAPTHA Demo</h1>
<form id="comment_form" action="form.php" method="post" >
<input type="email" name="email" placeholder="Type your email" size="40"><br><br>
<textarea name="comment" rows="8" cols="39"></textarea><br><br>
<input type="submit" name="submit" value="Post comment"><br><br>
</form>
<script>
// when form is submit
$('#comment_form').submit(function() {
// we stoped it
event.preventDefault();
var email = $('#email').val();
var comment = $("#comment").val();
// needs for recaptacha ready
grecaptcha.ready(function() {
// do request for recaptcha token
// response is promise with passed token
grecaptcha.execute('put your site key here', {action: 'create_comment'}).then(function(token) {
// add token to form
$('#comment_form').prepend('<input type="hidden" name="g-recaptcha-response" value="' + token + '">');
$.post("form.php",{email: email, comment: comment, token: token}, function(result) {
console.log(result);
if(result.success) {
alert('Thanks for posting comment.')
} else {
alert('You are spammer ! Get the @$%K out.')
}
});
});;
});
});
</script>
</body>
</html>
Interpretando la partitura
reCAPTCHA v3 devuelve una puntuación (1.0 es muy probable que sea una buena interacción, 0.0 es muy probable que sea un bot). En función de la puntuación, puede realizar acciones variables en el contexto de su sitio. Cada sitio es diferente, pero a continuación hay algunos ejemplos de cómo los sitios usan la puntuación. Como en los ejemplos a continuación, actúe entre bastidores en lugar de bloquear el tráfico para proteger mejor su sitio.
Use case | Recomendación |
---|---|
homepage | Vea una vista coherente de su tráfico en la consola de administración mientras filtra los raspadores. |
login | Con puntajes bajos, se requiere autenticación de 2 factores o verificación por correo electrónico para evitar ataques de relleno de credenciales. |
social | Limite las solicitudes de amigos sin respuesta de usuarios abusivos y envíe comentarios riesgosos a la moderación. |
e-commerce | Ponga sus ventas reales por delante de los robots e identifique las transacciones de riesgo. |
martes, 2 de abril de 2019
C# - Global.asax
El global.asax es el archivo de aplicación para todo proyecto ASP.NET, se encuentra en la raíz del proyecto. En él se declaran todos los eventos a nivel de aplicación como el inicio y fin de la misma, las peticiones web, etc... Es la evolución del antiguo global.asa existente en entornos de ASP clásico.
Se compila cada vez que inicia la aplicación. Cualquier modificación del archivo es detectada y origina el reinicio de la misma.
Eventos del global.asax
Entre todos los eventos global.asax, cabe destacar como principales los siguientes:
- Application_Init: Inicio de la aplicación
- Application_Disposed: Se dispara justo antes de que una aplicación sea destruida. Este método es ideal para limpiar anteriormente recursos que fueron utilizados.
- Application_Start: Se dispara cuando se ha creado la primera instancia de la clase HttpApplication. Esto permite crear objetos que son accesibles a las todas las instancias de HttpApplication.
- Application_End: Último evento lanzado antes de finalizar por completo la aplicación.
- Application_Error: Se ejecuta cuando salta un error no controlado dentro de la aplicación.
- Application_BeginRequest: Evento lanzado por cada petición de un cliente, ya sea el acceso a una url, una imagen, etc...
- Application_EndRequest: Último evento antes de dar finalizada una petición.
- Session_Start: Nueva sesión iniciada por un usuario. Muy usado junto al session_end para establecer contadores de usuarios activos.
- Session_End: Fin de sesión para un usuario.
Usos del global.asax
Puede ser usado para múltiples tareas de gestión de las aplicaciones. Unos ejemplos pueden ser:
- Declaración de filtros globales en el global.asax.
- Interactuar con todas las peticiones. Puede usarse para gestionar las peticiones, modificar variables de app, crear un log de las mismas, etc...
- Declarar modulos como el propio enrutado de asp.net.
- Gestionar los errores de la aplicación. Recogiendo los mismos dentro del evento onApplicationError, se puede establecer un control de estos, guardando un log y gestionando las redirecciones según el tratamiento deseado
using System; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Web; usingSystem.Web.Security; usingSystem.Web.SessionState; namespace WebApplication1 { public class Global : System.Web.HttpApplication { void Application_Start(object sender, EventArgs e) { // Código que se ejecuta al iniciarse la aplicación } void Application_End(object sender, EventArgs e) { // Código que se ejecuta cuando se cierra la aplicación } void Application_Error(object sender, EventArgs e) { // Código que se ejecuta al producirse un error no controlado } void Session_Start(object sender, EventArgs e) { // Código que se ejecuta cuando se inicia una nueva sesión } void Session_End(object sender, EventArgs e) { // Código que se ejecuta cuando finaliza una sesión. // Nota: el evento Session_End se desencadena sólo cuando el modo sessionstate // se establece como InProc en el archivo Web.config. Si el modo de sesión se establece como StateServer // o SQLServer, el evento no se genera. } } }
viernes, 29 de marzo de 2019
Paginas Web - Tipos MIME
Hay dos tipos primarios de MIME son importantes para el rol de tipos por defecto:
- text/plain es el valor por defecto para los archivos textuales. Un archivo textual debe ser legible y no puede contener datos binarios.
- application/octet-stream es el valor por defecto para todos los demás casos. Un tipo de archivo desconocido debe usar este tipo. Los navegadores tienen un cuidado particular cuando manipulan estos archivos, tratando de proteger al usuario previéndo comportamientos peligrosos.
IANA es el registro oficial de los tipos de media MIME y mantiene una lista oficial de todos los tipos de MIME. Esta tabla, lista algunos de los tipos de MIME importantes para la web:
Extensión | Tipo de documento | Tipo de MIME |
.aac | Archivo de audio AAC | audio/aac |
.abw | Documento AbiWord | application/x-abiword |
.arc | Documento de Archivo (múltiples archivos incrustados) | application/octet-stream |
.avi | AVI: Audio Video Intercalado | video/x-msvideo |
.azw | Formato eBook Amazon Kindle | application/vnd.amazon.ebook |
.bin | Cualquier tipo de datos binarios | application/octet-stream |
.bz | Archivo BZip | application/x-bzip |
.bz2 | Archivo BZip2 | application/x-bzip2 |
.csh | Script C-Shell | application/x-csh |
.css | Hojas de estilo (CSS) | text/css |
.csv | Valores separados por coma (CSV) | text/csv |
.doc | Microsoft Word | application/msword |
.epub | Publicación Electrónica (EPUB) | application/epub+zip |
.gif | Graphics Interchange Format (GIF) | image/gif |
.htm | Hipertexto (HTML) | text/html |
.html | ||
.ico | Formato Icon | image/x-icon |
.ics | Formato iCalendar | text/calendar |
.jar | Archivo Java (JAR) | application/java-archive |
.jpeg | Imágenes JPEG | image/jpeg |
.jpg | ||
.js | JavaScript (ECMAScript) | application/javascript |
.json | Formato JSON | application/json |
.mid | Interfaz Digital de Instrumentos Musicales (MIDI) | audio/midi |
.midi | ||
.mpeg | Video MPEG | video/mpeg |
.mpkg | Paquete de instalación de Apple | application/vnd.apple.installer+xml |
.odp | Documento de presentación de OpenDocument | application/vnd.oasis.opendocument.presentation |
.ods | Hoja de Cálculo OpenDocument | application/vnd.oasis.opendocument.spreadsheet |
.odt | Documento de texto OpenDocument | application/vnd.oasis.opendocument.text |
.oga | Audio OGG | audio/ogg |
.ogv | Video OGG | video/ogg |
.ogx | OGG | application/ogg |
Adobe Portable Document Format (PDF) | application/pdf | |
.ppt | Microsoft PowerPoint | application/vnd.ms-powerpoint |
.rar | Archivo RAR | application/x-rar-compressed |
.rtf | Formato de Texto Enriquecido (RTF) | application/rtf |
.sh | Script Bourne shell | application/x-sh |
.svg | Gráficos Vectoriales (SVG) | image/svg+xml |
.swf | Small web format (SWF) o Documento Adobe Flash | application/x-shockwave-flash |
.tar | Aerchivo Tape (TAR) | application/x-tar |
.tif | Formato de archivo de imagen etiquetado (TIFF) | image/tiff |
.tiff | ||
.ttf | Fuente TrueType | font/ttf |
.vsd | Microsft Visio | application/vnd.visio |
.wav | Formato de audio de forma de onda (WAV) | audio/x-wav |
.weba | Audio WEBM | audio/webm |
.webm | Video WEBM | video/webm |
.webp | Imágenes WEBP | image/webp |
.woff | Formato de fuente abierta web (WOFF) | font/woff |
.woff2 | Formato de fuente abierta web (WOFF) | font/woff2 |
.xhtml | XHTML | application/xhtml+xml |
.xls | Microsoft Excel | application/vnd.ms-excel |
.xml | XML | application/xml |
.xul | XUL | application/vnd.mozilla.xul+xml |
.zip | Archivo ZIP | application/zip |
.3gp | Contenedor de audio/video 3GPP | video/3gpp |
audio/3gpp if it doesn't contain video | ||
.3g2 | Contenedor de audio/video 3GPP2 | video/3gpp2 |
audio/3gpp2 if it doesn't contain video | ||
.7z | Archivo 7-zip | application/x-7z-compressed |
Suscribirse a:
Entradas (Atom)