PDA

Ver la Versión Completa : Lectura de teclado sin campo de texto


floren
16-09-2004, 13:51:30
Hola, es la primera vez que me hago presente en este foro de PHP.

Quisiéramos hacer una autenticación mediante lector de tarjeta con banda magnética. La cuestión sería que el usuario debería introducir su id y contraseña y saldría una ventana que diría "Pase su tarjeta por el lector".

Estas tarjetas y el lector aún no las tenemos, ya que estamos primero valorando si es viable económicamente.

Al igual que los lectores de barra,funcionan como emulación de teclado, es decir, al pasar la tarjeta por el lector aparecería la clave (pensamos en SHA-1) tipo 0091ab8ddc7...... , la cuestión estética hace que el usuario no vea este chorizo, pero que yo sí pueda captar esta secuencia como si la hubiese tecleado, para así hacer la comprobación de ambas cadenas y ver que coinciden.

¿Me he hecho un lío? Bueno, ¿sabéis cómo capturar el teclado sin usar un campo?

Gracias de antemano.

Floren

Mick
16-09-2004, 23:04:48
Para eso tienes los eventos OnKeyDown /OnKeyUp / OnKeyPress de cualquier form, segun los componentes visuales que uses en el form podria ser necesario que activases la propiedad "KeyPreview", esto asegura que todas las pulsaciones se envien antes al form, y no directamente al componente que tenga el foco en ese momento.

Saludos

kayetano
17-09-2004, 09:50:54
Hola

Tambien podrías utilizar un campo tipo "password" se ver pero no es legible por el usuario.

Otra opción, que no he probado, es utilizar estilos para hacer un campo invisible, lo que no se es si un campo con este estilo puede recibir el foco de la acción, todo es probar.

floren
17-09-2004, 13:55:17
Hola, gracias por vuestras respuesta:

Mick, tú me hablas de Delphi y yo me refiero a PHP (no me he equivocado de sitio, no?)

Kayetano, comentas algo que no sé implementar, la verdad. Existe una opción en JavaScript:



<SCRIPT language=JavaScript>
var SpecialWord = "hola",
SpecialUrl = "https://redirección",
SpecialLetter = 0;
function getKey(keyStroke) {
var isNetscape=(document.layers);
var eventChooser = (isNetscape) ? keyStroke.which : event.keyCode;
var which = String.fromCharCode(eventChooser).toLowerCase();
if (which == SpecialWord.charAt(SpecialLetter)) {
SpecialLetter++;
if (SpecialLetter == SpecialWord.length) window.location = SpecialUrl;
}
else SpecialLetter = 0;
}
document.onkeypress = getKey;

</SCRIPT>




Este código captura las pulsaciones de teclado de forma trasparente al usuario. Pero claro, si al tío le da por ver el código fuente de la página verá, aunque sea encriptada, la contraseña que tiene que teclear para que se le haga la redirección al sitio restringido, y entonces pierde el sentido tener la tarjeta.

Por eso lo de PHP y la captura "silenciosa" del teclado.

Gracias! Seguuuuimos buscando

kayetano
17-09-2004, 14:19:59
Ejemplo 1:

Con este ejemplo creo un campo tipo password donde no se ve lo que se escribe, una vez se manda el formulario "seguridad.php" se encarga de la comprobacion.
Nada mas acceder a es al formulario me situo en el capo dato.

prueba.php

<html>
<head>
<script language="javascript" type="text/javascript">
function init() {
document.forms["form_prueba"].elements["dato"].focus();
}
</script>
</head>

<body onLoad="init();">
<form action="seguridad.php" name="form_prueba" method="post">
<input type="password" name="dato">
<input type="submit">
</form>
</body>
</html>



Ejemplo 2:

Con este ejemplo creo un campo tipo texto y con estilo invisible con lo que no se ve el contenido ni el continente.
una vez se manda el formulario "seguridad.php" se encarga de la comprobacion.
Nada mas acceder a es al formulario me situo en el capo dato.

prueba2.php

<html>
<head>
<script language="javascript" type="text/javascript">
function init() {
document.forms["form_prueba"].elements["dato"].focus();
}
</script>
</head>

<body onLoad="init();">
<form action="seguridad.php" name="form_prueba" method="post">
<input type="text" name="dato" style="visibility:hidden">
<input type="submit">
</form>
</body>
</html>


El valor de comparación puede ser el que quieras, incluso obtenido de una base de datos. Lo comparas con el enviado desde el formulario y haces lo que tengas que hacer segun el resultado de esta comparación.

seguridad.php

<?
if( /*lo que sea**/ ) { // Compruebao que el valor $_POST["dato"] es correcto
header("Location: correcto.php");
exit();
} else { // No es correcto el valor
header("Location: error.php");
exit();
}
?>


Espero que te sirva de algo

jachguate
17-09-2004, 14:26:18
Podes extraer de este código en javascript solamente la parte que captura el teclado, y hacer que se vaya asignando a un elemento oculto de un formulario, y luego enviarlo con el método post, asi podas comparar en el servidor, via php, si la clave es la correcta.

Me parece la mejor solución.

Hasta luego.

;)

kayetano
17-09-2004, 16:08:04
Hola

Algo asin:

<html>
<head>
<SCRIPT language=JavaScript>
var which = "";

function getKey(keyStroke) {
var isNetscape=(document.layers);
var eventChooser = (isNetscape) ? keyStroke.which : event.keyCode;
which = which + String.fromCharCode(eventChooser);
}

function enviar( cual ){
cual.dato.value = which;
cual.submit();
}

document.onkeypress = getKey;
</SCRIPT>
</head>

<body>
<form action="seguridad.php" name="form_prueba" method="post">
<input type="hidden" name="dato">
<input type="button" onClick="enviar(this.form)" value="Enviar">
</form>
</body>
</html>


En explorer y opera funciona bien, en firefox y netscape no.

jachguate
17-09-2004, 20:20:13
Has podido detectar cual es el problema con firefox?

Quizas es el uso the this.form

Creo que podria funcionar si se le da un id nombre al formulario, y se accede a él por id?

Hasta luego.

;)

floren
20-09-2004, 07:54:39
¡Hola y gracias por vuestra ayuda! :p

Kayetano, la última opción casi sería la que necesitamos; la única dificultad con ese código es que precisamente captura todas las pulsaciones de teclado, incluidas claro el id_usuario y psw. Así que ahí estoy dándole vueltas ya que tal vez la de campo oculto que proponías al principio me solucione mucho, al no tener a priori los campos id y psw una longitud fija.

Sobre el tema del navegador no es dificultad ya que estamos en intranet, donde las configuraciones de equipos y navegadores usados son bien conocidas.

Gracias de nuevo y saludos.

Floren :)

kayetano
22-09-2004, 09:25:22
Hola

x jachguate
No creo que sea cosa del "this.form" yo lo utilizo mucho y nunca me ha dado problemas con firefox. Por las pruebas que puede hacer me da que es cosa del evento "onkeypress".

x floren
Pues nada ahora te toca decidir a ti y comerte el tarro para dar solución a tu problema.