Skip to content

Files

57 lines (44 loc) · 3.09 KB

File metadata and controls

57 lines (44 loc) · 3.09 KB

4.4 Envíos duplicados

No sé si alguna vez has visto algunos blogs o BBS tienen más de un mensaje exactamente iguales, pero te puedo decir que es porque los usuarios hicieron presentaciones duplicadas de forma posterior a esa fecha. Hay lotes de razones puede causar envíos duplicados, a veces los usuarios sólo hacer doble clic en el botón de enviar, o que desee modificar algunos contenidos después del post y pulse el botón de nuevo, o es por el propósito de que usuarios malintencionados en algunos sitios web voto. Es fácil ver cómo los envíos duplicados llevan a muchos problemas, así que tenemos que utilizar medios eficaces para prevenirlo.

La solución es que añadir un campo oculto con el token único a su forma, y ​​comprobar esta muestra cada vez antes de procesar los datos. Además, si usted está usando Ajax para enviar el formulario, utilice JavaScript para deshabilitar el botón una vez presentada presente.

Mejoremos ejemplo en la sección 4.2:

<input type="checkbox" name="interest" value="football">Football
<input type="checkbox" name="interest" value="basketball">Basketball
<input type="checkbox" name="interest" value="tennis">Tennis
Username:<input type="text" name="username">
Password:<input type="password" name="password">
<input type="hidden" name="token" value="{{.}}">
<input type="submit" value="Login">

Se utilizó MD5 (sello de tiempo) para generar modo, y se añade a campo y la sesión oculto en el lado del servidor (capítulo 6), entonces podemos utilizar este token para comprobar si se ha presentado este formulario.

func login(w http.ResponseWriter, r *http.Request) {
	fmt.Println("method:", r.Method) // get request method
	if r.Method == "GET" {
    	crutime := time.Now().Unix()
    	h := md5.New()
    	io.WriteString(h, strconv.FormatInt(crutime, 10))
    	token := fmt.Sprintf("%x", h.Sum(nil))

    	t, _ := template.ParseFiles("login.gtpl")
    	t.Execute(w, token)
	} else {
    	// log in request
    	r.ParseForm()
    	token := r.Form.Get("token")
    	if token != "" {
    	    // check token validity
    	} else {
    	    // give error if no token
    	}
    	fmt.Println("username length:", len(r.Form["username"][0]))
    	fmt.Println("username:", template.HTMLEscapeString(r.Form.Get("username"))) // print in server side
    	fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))
    	template.HTMLEscape(w, []byte(r.Form.Get("username"))) // respond to client
	}
}

Figura 4.4 El contenido en el navegador después de añadido simbólico

Usted puede volver a cargar esta página y verá diferente símbolo cada vez, por lo que este mantiene toda forma es única.

Por ahora se puede prevenir muchos de los ataques de envíos duplicados mediante la adición de contadores a su forma, pero no puede prevenir todos los ataques engañosos, hay mucho más trabajo que debe hacerse.

Enlaces