Starší komentáře ke článku: Zamezení vícenásobného odeslání formuláře JavaScriptem

Zpět na článek | Úvodní stránka Interval.cz

Avatar

Autor komentáře: Riki Fridrich

Datum vložení: 7.9.2004 13:03:34

Asi mi nieco uniklo, ale co vlastne tento skript riesi? Sam autor priznava, ze formular sa aj tak da odoslat stlacenim enteru v nejakom policku (co je prva vyhrada, ktora ma pri pohlade na clanok napadla). Nebolo by teda vhodne osetrit to nejak zmysluplnejsie, jednoduchsie a elegantnejsie nez disablovanim odosielacich tlacitok?

Len tak z hlavy ma napada jedno riesenie (nekamenujte ma, ak to nebude fungovat, je to fakt len napad):
onsubmit="this.onsubmit=function(){alert('pracujem na tom');return false;}"

Ludsky povedane: ak formular odoslem, kazdy dalsi pokus o odoslanie formulara (je jedno, ci klikanim na tlacitko, entrom v policku alebo nejakym dalsim skriptom - vsetky tieto veci vyvolavaju udalost onsubmit) zobrazi alert a potom vykonanie submitu utne.

Myslim, ze keby som riesil takyto problem, radsej by som postupoval takto. Alebo to autor skusal a z nejakeho dovodu to takto proste nejde?

PS: To s tou podtrznikovou konvenciou pomenovania funkcii som nejako nepochopil. Preco? A preco hned dva?

Avatar

Autor komentáře: Bred

Datum vložení: 7.9.2004 13:13:59

Ukázka nefunguje. Nevím zdali je chyba na mé straně, ale při odeslání formu se napíše, že stránka nelze zobrazit.

Avatar

Autor komentáře: the.arul

Datum vložení: 7.9.2004 14:45:22

Proč to neudělat třeba nějak takhle (rozhodně funkčnější):

<script type="text/javascript">
function vypni(){
document.formular.submit.disabled = true;
return true;
}
</script>
<form name='formular' action='blabla.aspx.jsp.php.html' method='GET POST' onsubmit='return vypni()'>
<input type='text' name='blabla' />
<input type='submit' name='submit' value='odeslat' />
</form>

Avatar

Autor komentáře: lazyboy

Datum vložení: 7.9.2004 17:01:43

Spravne receno je javascript pro kontrolu formularu asi tak dobrej jako mrtvymu zimnik... resp. pokud by nekdo teoreticky chtel timto zahltit server staci si zkopirovat ten vas formular a poslat ho tam kde se ma zpracovat z jineho webu a do minuty muzete mit zahlceny server, lepsi je asi kontrolovat na strane serveru (i kdyz je to pomalejsi). Protoze tyto skripty proste neochrani nic......

howgh

Avatar

Autor komentáře: the.arul

Datum vložení: 7.9.2004 17:08:59

Myslim ze kontrolovat k tomu adresu odkad prisel pozadavek a pri "nespravne odpovedi" ukoncit beh skriptu neni problem.
Timto jen zabranite BFU aby vam floodoval server...
A o to myslim ve clanku slo...

Avatar

Autor komentáře: lazyboy

Datum vložení: 8.9.2004 8:45:20

imho asi jsme si nerozumeli ze? kdyz si stahnu kod teto stranky a vyjmu z nej java script na ochranu cehokoli zahltim vas server myslim dost rychlym zpusobem, jen jsem se snazil rici ze ochrana na strane klientu jen takove klise pro neznalky, kdo bude chtit tak vas posle do /dev/null........

Avatar

Autor komentáře: the.arul

Datum vložení: 8.9.2004 16:39:54

Urcite jsme si neorumeli, pokud pozadavek prijde od jinud nez napriklad <a href='http://interval.cz/__redirect/redirect.asp?what=interval_discussion&url=http://www.domena.cz' target='_blank'>http://www.domena.cz</a> bude automaticky odriznut ;-)
A jak jsem zminil vyse, toto opatreni je spise proti BFU...
Take neni problem k tomuto pridat i kontrolu na serveru napr. pomoci sessions (pokud mluvime o php)...

Avatar

Autor komentáře: Dusan Hlavaty

Datum vložení: 8.9.2004 8:55:21

Si myslim, ze autorovi neslo o to aby zabranil zahlcovaniu servra. Zmysel je skor zvysit uzivatelsky komfort. Skusim priklad: Kolkokrat sa uz stalo, ze ste napisali prispevok do diskusneho fora, stlacili SUBMIT a dlho dlho nic. A tak ste ho stlacili znova a znova. A nakoniec ste tam ten svoj prispevok mali 3, 4, 5 krat. Myslim ze na taketo pripady by to mohlo byt celkom vhodne riesenie (samozrejme ze sa da obijst). No a samozrejme treba davat pozor, aby ste si nespravnym JavaScriptom 'neodrezali' niektorych uzivatelov (napr. Opera, Safari, Mozilla) od svojej aplikacie. Takze JS ladit, ladit a ladit.

Avatar

Autor komentáře: jirkaz

Datum vložení: 9.9.2004 14:17:12

Co tak použít PHP Scriptserver <a href='http://interval.cz/__redirect/redirect.asp?what=interval_discussion&url=http://xmlrpccom.sourceforge.net/scriptserver/' target='_blank'>http://xmlrpccom.sourceforge.net/scriptserver/</a> a přes XMLRPC synchroně vykonat PHP kód na serveru? Přímo na onClick si mohu umístit volání PHP funkce - a pokud provedu volání synchronně, uživatel dostane možnost stisknout další tlačítko až PO vykonání PHP funkce - tedy v době, kdy už jsou všechna data dávno na serveru. Jelikož nedojde k přechodu na jinou stránku, tak ani nevadí pokud uživatel klikne vícekrát.

(také viz <a href='http://interval.cz/__redirect/redirect.asp?what=interval_discussion&url=http://zahradil.info/=/odesilani-formulare-javascriptem)' target='_blank'>http://zahradil.info/=/odesilani-formulare-javascriptem)</a>

Avatar

Autor komentáře: takeda

Datum vložení: 25.10.2004 7:47:29

myslim ze najjednoduchsia cesta ako tento problem vyriesit je pouzit samostatny skript napr. vykonaj.php ktory bude vykonavat vsetky operacie nad databazou a po ich vykonani presmeruje pomocou header na dalsi krok resp. kde je potrebne napr.

:formular.php
<form action="vykonaj.php" method="post">
... nasleduje klasicky formular
</form>

:vykonaj.php
..tento obsahuje rozne funkcie podla jednotlivych podmienok napr.
<?
if($odoslal) mysql_query("inserti into db (...) values (..)");
header('location: odoslany.php');
?>

:odoslany.php
stranka napr. s potvrdenim o odoslani formulara

pri tejto metode nemoze dojst k viacnasobnemu odoslaniu formulara z toho titulu, ze zapis do db sa vykona az ked dojde k nacitaniu vykonaj.php

dufam ze to co som napisal aspon niekto pochopil

Avatar

Autor komentáře: mum2y

Datum vložení: 29.11.2004 13:38:29

takze ako zabranim refreshu? F5?
osetrovat to na strane clienta, neviem, ked aj tak to treba na strane servera
moje kratke riesenie -> ked spracujem hodnoty z POST, tak pridam do HTML javascript: location.href= ..(to iste), cim sa eliminuju predchadzajuce hopnoty POSTu

Avatar

Autor komentáře: Pavel Růžička

Datum vložení: 15.12.2004 13:10:52

> takze ako zabranim refreshu? F5?
typicky provedením přesměrování po zpracování přijatých dat na serveru, je to v článku tuším uvedeno

Avatar

Autor komentáře: mahux

Datum vložení: 17.4.2005 10:01:19

Ja by som to urobil cez cookies jednoducho pri odoslaní si nastavím nejaké cookies a pred odoslaním len overím či bolo odoslané. (ak nie cookies tak session)!! ???

Avatar

Autor komentáře: win

Datum vložení: 26.6.2005 11:03:10

Mne cely clanek prisel spis jako zajimavy napad, rozhodne nasazenim tehle metody nikdo nic nepokazi. GJ

Avatar

Autor komentáře: Misty

Datum vložení: 2.6.2008 10:41:59

Jde tento příklad zamezení upravit na zamezení vícenásobného kliknutí na odkaz <a herf="neco">

Zpět na článek | Úvodní stránka Interval.cz