Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelmia palautelomakkeessa

Sivun loppuun

Codeprofile [14.01.2007 18:40:37]

#

Yritäin tehdä semmoista palautelomaketta, mutta nyt tuli jälleen ongelma eteen. Palaute ei nähkääs lähde. Ei muuten olisi mitään kysymistä, muttakun palautteen lähtö vaikuttaa johtuvan mitä ihmeellisemmästä syystä. Tiedoston "palautelomake.php" sisältö on tämän-näköinen:

<html>
<title>Palautelomake</title>
<body>

<font face="Verdana" size=2>
Tämän palautelomakkeen avulla voit lähettää palautetta sivujen omistajalle.

<form method="post" action="laheta.php">
Nimesi: <input type="text" name="nimi"><br>
Sähköpostisi: <input type="text" name="email"><p>
Viesti:<br>
<textarea name="viesti" rows="25" cols="30"></textarea>
<input type="submit" value="Lähetä">
</form>

</font>

</body>
</html>

Tuolla koodilla palaute ei suostu lähtemään osoitteeseen. MUTTA: Alla olevalla koodilla palaute lähtee, mutta ilman sisältöä:

<html>
<title>Palautelomake</title>
<body>

<font face="Verdana" size=2>
Tämän palautelomakkeen avulla voit lähettää palautetta sivujen omistajalle.

Nimesi: <input type="text" name="nimi"><br>
Sähköpostisi: <input type="text" name="email"><p>
Viesti:<br>
<textarea name="viesti" rows="25" cols="30"></textarea>

<form action="laheta.php">
<input type="submit" value="Lähetä">
</form>

</font>

</body>
</html>

Miksi palaute siis lähtee alimmaisen koodin kautta, muttei ylimmäisen??

tkarkkainen [14.01.2007 18:50:24]

#

Alemmassa koodissa ei ole järkeä. Formissa itsessään ei ole muuta kuin lähetä-nappi, jolloin muuta sisältöä ei luonnollisesti välitetä laheta.php:lle.

Se, että ylemmällä koodilla palaute ei lähde, johtuu todennäköisesti laheta.php:ssa olevasta virheestä. Sen koodista voisi olla apua ongelman ratkaisussa.

Codeprofile [14.01.2007 18:51:23]

#

Tässä on sen laheta.php-tiedoston sisältö:

<?php
// Tekijä: Emil Tuomi <http://koti.mbnet.fi/cpf>
// Säilytä tekijän nimi!

// Tarkistetaan ettei mikään suojausmenetelmä petä
if (isset($plomake)) { echo "Odota vähintään 2-minuuttia viestien lähetysten välillä."; exit; }
if (strlen($viesti) > 10000) { echo "Kirjoitteleppas vähän lyhempää viestiä. 10000-merkkiä on suurin mahdollinen pituus."; exit; }

// Luodaan evästettä typerien floodaus-viestien takia
setcookie("plomake", "Palautelomakkeen aikajakso", time() + 60 * 2);

// Selvitetään käyttäjän hosti
$iposoite = $_SERVER['REMOTE_ADDR'];
$host = gethostbyaddr($iposoite);

// Muotoillaan viestiä hienommaksi
$palaute = "$viesti\n\n\n$host\nVastaus: $vastaus\nSähköposti: $email";

// Lähetetään palaute alla määritettyyn osoitteeseen
$laheta = mail("emtuomi@hotmail.com", "$aihe", "$palaute");

if($laheta) {
   header("Location: kiitos.php");
} else {
   header("Location: virhe.php");
}
?>

Tuo koodi on muutenkin aika paljon kesken.

EDIT: Huppista! Tuosta puuttui aihe-kenttä. Mutta ei se toimi sittenkään.

tkarkkainen [14.01.2007 18:57:42]

#

Jos IP-osoite selviää $_SERVER-taulukon avulla, niin register_globals on poissa päältä, kuten suositus kuuluu. Joudut viittaamaan lomakekenttiin nimillä $_POST['viesti'], $_POST['nimi'] ja $_POST['email']. Eväste löytyy muuttujasta $_COOKIE['plomake'].

Mail-kutsusi sisältää tietoturva-aukon, tällaisenaan koodia voi käyttää spämmin välittämiseen. Estäminen onnistuu seuraavasti:

mail("emtuomi@hotmail.com", "$aihe", "\r\n\r\n$palaute");

Näin estetään ylimääräisten headereiden laittaminen.

EDIT: Saanen myös huomauttaa, että kahden minuutin floodisuojauksesi pettää, jos käyttäjä ottaa evästeet pois käytöstä.

Codeprofile [14.01.2007 19:05:11]

#

Vähän huono PHP-kysymys: Siis millä koodilla kokonaisuudessaan saan palautteen lähtemään.

tkarkkainen [14.01.2007 19:11:11]

#

Ennen kuin unohtuu mainita, niin lisäisin, että tuolla cookie-patentilla et saa minkäänlaista floodisuojausta aikaan. On suorastaan luvattoman helppoa rakennella systeemi, joka lähettää noita maileja melkoisen monta melkoisen lyhyessä ajassa :)

Siivotaan nyt sitten muiden koodia:

<?php

// Tarkistetaan ettei mikään suojausmenetelmä petä (joopa joo)
if (isset($_COOKIE['plomake'])) { echo "Odota vähintään 2 minuuttia viestien lähetysten välillä."; exit; }
if (strlen($_POST['viesti']) > 10000) { echo "Kirjoitteleppas vähän lyhempää viestiä. 10000 merkkiä on suurin mahdollinen pituus."; exit; }

// Luodaan evästettä typerien floodaus-viestien takia
setcookie("plomake", "Palautelomakkeen aikajakso", time() + 60 * 2);

// Selvitetään käyttäjän hosti
$iposoite = $_SERVER['REMOTE_ADDR'];
$host = gethostbyaddr($iposoite);

// Muotoillaan viestiä hienommaksi
$palaute = $_POST['viesti']."\n\n\n$host\nSähköposti: ".$_POST['email']."\n";

// Lähetetään palaute alla määritettyyn osoitteeseen
$laheta = mail("emtuomi@hotmail.com", "$_POST['aihe']", "\r\n\r\n$palaute");

if($laheta) {
   header("Location: kiitos.php");
} else {
   header("Location: virhe.php");
}
?>

Poistin tuon vastaus-kohdan, kun en nähnyt, mistä ihmeestä sen kiskoit. Saa soveltaa. Korjasin myös pari suomen kieleen liittyvää virhettä.

tsuriga [14.01.2007 19:13:35]

#

tkarkkainen kirjoitti:

Jos IP-osoite selviää $_SERVER-taulukon avulla, niin register_globals on poissa päältä

Kyllä nuo superglobaalit taulukot ovat silti voimassa vaikka register_globals olisikin On, ainakin pienen testailun tuloksena ja eihän tuo sinällään ole mitenkään superglobaalit poissulkeva optio.

Eikä merkkijonoja tartte "muuttaa" merkkijonoiks ymppäämällä lainausmerkit muuttujan ympärille, se on merkkijono jos se kerran on merkkijono, ja PHP muutenkin tekee nuo muutokset automaagisesti. Ja jos tarvitseekin niin mieluiten erikseen ja vaikka settypellä tai millä hyvänsä, tuo näyttää niin purkalta.

Codeprofile [14.01.2007 19:15:34]

#

Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /mbnet/c/cpf/laheta.php on line 18

tkarkkainen [14.01.2007 19:25:26]

#

tsuriga kirjoitti:

Kyllä nuo superglobaalit taulukot ovat silti voimassa vaikka register_globals olisikin On, ainakin pienen testailun tuloksena ja eihän tuo sinällään ole mitenkään superglobaalit poissulkeva optio.

Eipä ole tullut tuolta kannalta ajateltuakaan, itse kun koodaan PHP:ni aina niin että register_globals on pois päältä. Ilmeisesti koodini pitäisi sitten toimia muuttamattomana myös register_globalsia päällä pitävillä servereillä.


Tuo parse errori saattaa johtua siitä, että $_POST['aihe'] jäi epähuomiossa lainausmerkkeihin. Kokeile ottaa lainausmerkit sen ympäriltä pois. Voi johtua myös siitä, että tämänhetkisellä lomakkeellasi ei ole aihe-nimistä kenttää.

Blaze [14.01.2007 19:26:06]

#

tkarkkainen kirjoitti:

$laheta = mail("emtuomi@hotmail.com", "$_POST['aihe']", "\r\n\r\n$palaute");
$laheta = mail("emtuomi@hotmail.com", $_POST['aihe'], "\r\n\r\n$palaute");

Tai jos on ihan pakko saaja lainausmerkit tuohonkin, niin

$laheta = mail("emtuomi@hotmail.com", "{$_POST['aihe']}", "\r\n\r\n$palaute");

Ai niin, ja speksin mukaan Location-headerissa pitäis olla aina absoluuttinen URL.

Codeprofile [14.01.2007 20:06:46]

#

Palaute ei lähde vieläkään.

tkarkkainen [14.01.2007 20:13:01]

#

Tuolla ongelmakuvauksella on hankala lähteä arpomaan mitään.

Olethan tarkastanut, ettei hotmail tulkitse viestiä spämmiksi?

Codeprofile [14.01.2007 20:14:52]

#

Olen. Tuossa koodissa on pakko mätätä joku.

EDIT: Alkaa tulla sellainen vaikutelma, että onglema on niin helppo ratkaista, ettei niin läheltä osaa etsiä :D

EDIT: Ja nyt kun rupesin asiaa etsimään mahdollisimman läheltä, helpotuin. Palaute lähtee hyvin, kun ottaa tuon $laheta-kohdan pois.

Mutta nyt toinen kysymys:
Miten se if-ehtolause sovelletaan tuohon??

EDIT: JESS! NYT TOIMII! Jo oli pienestä kiinni; if-ehtolauseesta puuttui väli!

EDIT: Se vika olikin näköjään hotmailissa. "Palvelin kuormittunut"-tyyppinen ilmoitus tuli ruutuun.

Antti Laaksonen [14.01.2007 21:08:09]

#

Vika lienee tosiaan tuon PHP-koodin ulkopuolella. Myöhemmin tuleva if-lause ja sen mahdolliset välit eivät vaikuta mitenkään mail-funktion toimintaan.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta