Contactformulier beveiligen tegen verzending van lege velden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Dirk De Coster

Dirk De Coster

10/03/2016 15:23:43
Quote Anchor link
Hallo allemaal,

Ik heb een website gemaakt voor de winkel van mijn vrouw, en op de html-pagina met haar contactgegevens heb ik een php-contactformulier gezet dat ik ergens op het internet vond.

Nu stel ik vast dat je dit kan verzenden ook als je niks hebt ingevuld. Kan iemand mij helpen om dit te beveiligen. Ik heb zelf weinig kaas gegeten van php, vandaar mijn postje op dit forum.

Het php bestandje mail.php ziet er zo uit :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$name
= $_POST['name'];
$email = $_POST['email'];
$phone = $_POST['phone'];
$message = $_POST['message'];
$formcontent="From: $name \n Message: $message";
$formcontent="From: $name \n Telefoon; $phone \n Message: $message";

//verander hieronder je emailadres
$recipient = "[email protected]";


//verander hieronder evt de teksten en de html
$subject = "Aanvraag via de website van ArteShop";
$mailheader = "From: $email \r\n";
mail($recipient, $subject, $formcontent, $mailheader) or die("Error!");
echo "
<h3>Bedankt! Uw bericht werd goed verzonden. We nemen zo snel mogelijk contact met u op.<br />
<a href='index.html'>Terug naar de website van ArteShop</a></h3>
"
;
?>



En het html-bestand contact.html ziet er zo uit :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" name="keywords" content="ArteShop, lederwaren, juwelen, jewels, bags, fashion">
    <title>Arte Shop</title>
    <link rel="stylesheet" href="css/style.css" type="text/css">
    <style type="text/css">
<!--
.style5 {font-family: Arial, Helvetica, sans-serif}
.style6 {color: #333333}
.style3 {
    color: #333333;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 13px;
    font-weight: bold;
}
.style7 {font-size: 12px}
.style12 {font-weight: bold}
.style14 {color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 20px; font-weight: bold; }
-->
    </style>

</head>
<body>
<div class="header" style="display:block;">
      <div>      
      <img src="images/logoarteshop2.png" alt="" width="327">
      <ul>
                <li>
                    <a href="index.html">Home</a>
                </li>
                <li>
                    <a href="about.html">About</a>
                </li>
                <li>
                    <a href="#">Collections</a>
                    <ul>
                        <li>
                            <a href="jewels.html">Jewels</a>
                        </li>
                        <li>
                            <a href="handbags.html">Bags</a>
                        </li>
                        <li>
                            <a href="fashion.html">Fashion</a>
                        </li>
                     </ul>
                  </li>
                        <li>
                    <a href="shop.html">Shop</a>
                </li>
                <li>
                    <a href="contact.html">Contact</a>                  
                </li>
        </ul>
        </div>
    </div>
    <div class="body">
      <div>
        <div class="collections">
            <div class="navigation">
                <ul>
                    <li class="selected">
                    <a href="#">CONTACT ARTESHOP</a>
                    </li>
                </ul>
            </div>
    
          <div>
            <table width="100%" height="100%" border="0">
              <tr>
                <td height="86" colspan="5"><div align="center"><span class="style14"><br>ARTESHOP- Straat 12 - 9999 De Gemeente- Tel. 059 99 99 99</span></div></td>
              </tr>
            </table>
            <table width="100%" height="100%" border="0">
                 <tr>
                   <td width="266" rowspan="10"><img src="images/figure34.jpg" alt="" width="218" style="border:1px solid white"></td>
                          <td>&nbsp;</td>
                          <td colspan="3"><span class="style3">OPENINGSUREN </span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td colspan="3">&nbsp;</td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td>&nbsp;</td>
                          <td colspan="2">&nbsp;</td>
              </tr>
                 <tr>
                   <td width="8">&nbsp;</td>
                          <td width="143"><span class="style7 style6 style5 style12"><strong>Maandag</strong></span></td>
                          <td colspan="2"><span class="style7 style6 style5"><strong>gesloten</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Dinsdag</strong></span></td>
                          <td width="135"><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td width="370"><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Woensdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Donderdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Vrijdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Zaterdag</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>10:00-12:30</strong></span></td>
                          <td><span class="style7 style6 style5 style2"><strong>14:00-18:00</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td><span class="style7 style6 style5 style2"><strong>Zondag</strong></span></td>
                          <td colspan="2"><span class="style7 style6 style5 style2"><strong>10:00-13:00 (enkel tijdens schoolvakanties)</strong></span></td>
              </tr>
                 <tr>
                   <td>&nbsp;</td>
                          <td>&nbsp;</td>
                          <td>&nbsp;</td>
                          <td colspan="2">&nbsp;</td>
              </tr>
                 <tr>
                   <td height="86" colspan="5"><div align="center"><span class="style3"><br>
                   Hebt u een vraag, een klacht of een opmerking ? ArteShop staat klaar om ze te beantwoorden. <br>
                   U kunt ons bereiken per telefoon of door gebruik te maken van onderstaand contactformulier.</span></div></td>
              </tr>
            </table>
            <style>
input, textarea {
    padding:5px;
    border:2px solid #ccc;
    border-radius: 5px;
    width="60";
    font:12px Verdana;
    margin-bottom:10px;
}

input[type=submit] {
    padding:5px 15px;
    background:#ccc;
    border:0 none;
    cursor:pointer;
    width:100px;
    border-radius: 5px; }
    
input[type=submit]:active {
    padding:5px 15px;
    background:#cdc;
}
            </style>
            <form name="contactform" method="post" action="mail.php">
  
            <div align="center">
      <input type="text" name="name" placeholder="Naam"  size="60"/>
      <br />
      
  <input type="email" name="email" placeholder="Email"  size="60"/>
      <br />
      
  <input type="text" name="phone" placeholder="Telefoonnummer"  size="60"/>
      <br />
      
  <textarea name="message" placeholder="Bericht" cols="60" rows="6"></textarea>
      <br />
      <br />
      <input type="submit" value="Verzenden" />                                                      
              </div>
            </form>
            <table width="870" height="49%" border="0">
<tr>
 
   <td width="614"><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2496.132492806767!2d3.0341832000000113!3d51.27188020000002!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47dcaafb4d232d9b%3A0x6d658c1be745677e!2sArte+Mio!5e0!3m2!1snl!2sbe!4v1440675281009" width="100%" height="349" frameborder="0" style="border:1px solid white" allowfullscreen></iframe></t>
   <td width="22">  
   <td width="220"> <img src="images/figure5.jpg" width="218" height="349" style="border:1px solid white">
</tr>
</table>


                
          </div>
        </div>
      </div>
</div>
    <div class="footer">
        <div>
            <p>
                &#169; 2015 DIRK DE COSTER</p>
            <div class="connect">                <a href="index.html" id="facebook">Facebook</a> <a href="https://www.google.be/maps/place/Arte+Shop/@51.2719902,3.0341832,17z/data=!3m1!4b1!4m2!3m1!1s0x47dcaafb4d232d9b:0x6d568c1be745677e" id="googleplus">Google+</a>
            </div>
        </div>
    </div>
</body>
</html>




Voor alle duidelijkheid : ik heb hier en daar wat gegevens (mail adres - telefoonnummer, etc ...) gewijzigd in dit script om de privacy te bewaren.


Hopelijk kan iemand mij helpen ?

Alvast bedankt,
Dirk
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 10/03/2016 15:25:54 door - Ariën -
 
PHP hulp

PHP hulp

25/12/2024 02:10:49
 
- Ariën  -
Beheerder

- Ariën -

10/03/2016 15:39:23
Quote Anchor link
Je kan prima controleren of er iets in ingevuld door te kijken naar de $_POST variabelen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if(trim($_POST['naam'])=='') {
    // het veld is leeg
}
?>


Verder zou ik de structuur aanpassen, en eerst kijken of het formulier verstuurd is via POST:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
    // er is gepost, voer hier de invoercontrole(s) uit
    // als deze gepasseerd zijn, dan kan je de mail versturen

}
?>


Verder zou ik ook even kijken naar de juiste mailheaders:
http://phpwiki.santhe.nl/index.php?title=De_juiste_mailheaders
Gewijzigd op 10/03/2016 15:39:37 door - Ariën -
 
Dirk De Coster

Dirk De Coster

10/03/2016 15:47:03
Quote Anchor link
Bedankt, Ariën.

Moet ik dit script dan opnemen in mijn php-code ?
 
- Ariën  -
Beheerder

- Ariën -

10/03/2016 15:47:42
Quote Anchor link
Ja, maar zorg dat wel enige kennis van de basis hebt. Anders kan ik wel even een opzetje maken.
Gewijzigd op 10/03/2016 15:50:46 door - Ariën -
 
Dirk De Coster

Dirk De Coster

10/03/2016 15:50:49
Quote Anchor link
Oké, ik probeer het uit. Mag ik dit script gewoon onderaan toevoegen ? Of moet dit helemaal bovenaan ? Sorry Ariën, maar ik heb geen enkele php-kennis. Bij mij is 't meestal trial and error :-)

Groeten,
Dirk
 
- Ariën  -
Beheerder

- Ariën -

10/03/2016 15:52:51
Quote Anchor link
Het belangrijkste is dat je de juiste opbouw hanteert, bij ene puzzel passen de stukjes immers ook maar op één juiste manier tot je een mooie afbeelding ziet. Ik ga even wat knutselen...

Het is een simpele validatie zonder controle op de soort invoer.
Verder is het script ongetest... ;-)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
// Geef GELDIGE adressen op
// Een korte benaming voor jouw website

$website_naam = 'Mijn Site';
// Jouw eigen geldige emailadres
$eigen_emailadres = 'mijn_emailadres@mijn_domein.nl';
// Een geldig emailadres voor errors
$error_emailadres = 'mijn_emailadres@mijn_domein.nl';
// De naam van de verzender
$naam_verzender = 'Afzender';
// Het geldige emailadres van de afzender
$email_verzender = 'emailadres_van_verzender@zijn_domein.nl';
// Een geldig emailadres of helemaal leeg laten
$bcc_emailadres = 'geldig_emailadres@geldig_domein.nl';
// HTML mail? True/False
$html = true;

if($_SERVER['REQUEST_METHOD']=="POST") { // controleer hier of het formulier verstuurd is via de POST-method
    $errors = array(); // we initialiseren een array met de foutmeldingen!
    if(trim($_POST['name']) == "") {
        $errors[] = "Er is geen naam ingevuld";
    }

    if(trim($_POST['email']) == "") {
        $errors[] = "Er is geen email ingevuld";
    }

    if(trim($_POST['phone']) == "") {
        $errors[] = "Er is geen telefoonnummer ingevuld";
    }

    if(trim($_POST['message']) == "") {
        $errors[] = "Er is geen bericht ingevuld";
    }


    if(count($errors)>0) { // er zijn één of meerdere errors
            echo 'De volgende fouten zijn opgetreden:<ul>';
            foreach($errors as $error) {
                echo "<li>".$error."</li>".PHP_EOL;
            }

            echo '</ul>';
    }
else {
            // alle validaties zijn goed, we kunnen hier mailen
            
            $headers     = 'From: ' . $website_naam . ' <' . $eigen_emailadres . '>' . "\r\n";
            $headers    .= 'Reply-To: ' . $naam_verzender . ' <' . $email_verzender . '>' . "\r\n";
            $headers    .= 'Return-Path: Mail-Error <' . $error_emailadres . '>' . "\r\n";
            $headers    .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . "\r\n" : '';
            $headers    .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
            $headers    .= 'X-Priority: Normal' . "\r\n";
            $headers    .= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
            $headers    .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . "\r\n" : '';
            $message =
"Bericht: ".$_POST['message'].PHP_EOL .
"Telefoon :".$_POST['phone'].PHP_EOL .
"Naam: ".$_POST['name'];
            if(mail($eigen_emailadres, "Een bericht vanaf je contactformulier", $message, $headers)) {
                echo "De mail is verzonden";
            }
else {
                echo "De mail is niet verzonden, mogelijk vanwege een configuratiefout";
            }
        }
    }

?>
Gewijzigd op 11/03/2016 12:27:51 door - Ariën -
 
Dirk De Coster

Dirk De Coster

10/03/2016 17:38:47
Quote Anchor link
Bedankt Ariën, ik probeer het morgen eens uit.

Alvast bedankt voor je hulp.

Groeten,
Dirk
 
Thomas van den Heuvel

Thomas van den Heuvel

10/03/2016 17:56:52
Quote Anchor link
Ik zou het verwerken van het formulier echt opnemen in een aparte, afzonderlijke stap. En de terugkoppeling opnemen in een andere, afzonderlijke stap.

Daarnaast zou ik het mailformulier op zijn minst beveiligen met een (CSRF) token, zodat dit formulier niet vanaf een andere website verstuurd kan worden. Of meteen voor een oplossing gaan met een CAPTCHA functionaliteit.

Bij het afwezig zijn van een van twee, of beide, bovenstaande voorzieningen is je formulier mogelijk nog steeds gevoelig voor misbruik.

Ook wordt de formulierdata in het bovenstaande voorbeeld voor het grootste deel niet doorgegeven, enkel "message"?

:/
 
- Ariën  -
Beheerder

- Ariën -

10/03/2016 18:12:44
Quote Anchor link
Het ging mij even om een simpel voorbeeld. Het laatste heb ik in ieder geval aangepast. Gewoon een foutje van mij, geen ':/' voor nodig ;-)
 
Dirk De Coster

Dirk De Coster

11/03/2016 10:06:39
Quote Anchor link
Ariën, ik heb het php-script opgenomen en bij $eigen_emailadres en $error_emailadres mijn e-mail adres ingegeven. Vervolgens heb ik het php-bestand op de internetserver gezet en via de website het contactformulier ingevuld. De mail kwam toe in mijn post-bus. So far so good ...

Maar als ik één van de velden niet invulde dan kwam ik op de pagina http://ArteShop/mail.php terecht, een blanco webpagina. Er werd geen mail verstuurd, dat is goed, maar is het niet mogelijk om ergens een pop-up in te bouwen die zegt dat je "alle velden moet invullen" ?

Groeten,
Dirk
 
- Ariën  -
Beheerder

- Ariën -

11/03/2016 10:11:31
Quote Anchor link
Er mist een </ul> aan de lijst van de getoonde errors.

Verder zijn popups niet meer van de tijd, en is het beter om ze te verzamelen.
 
Dirk De Coster

Dirk De Coster

11/03/2016 10:13:37
Quote Anchor link
Ariën, ik ben efkes niet mee. Waar moet ik die </ul> dan zetten ?
 
- Ariën  -
Beheerder

- Ariën -

11/03/2016 10:15:18
Quote Anchor link
Na de foreachlus op lijn 33
 
Dirk De Coster

Dirk De Coster

11/03/2016 10:25:17
Quote Anchor link
Ik heb die </ul> gezet op lijn 33 maar krijg nu deze melding :

Parse error: syntax error, unexpected '<' in /home/arteshop/www/mail.php on line 33
 
- Ariën  -
Beheerder

- Ariën -

11/03/2016 10:28:46
Quote Anchor link
Gokje: Je plaatst HTML in PHP, wat niet zomaar kan.. Kijk eens een paar regels hoger naar hoe het wel moet.
 
Dirk De Coster

Dirk De Coster

11/03/2016 10:42:33
Quote Anchor link
Sorry Ariën, ik snap echt niet waar ik die </ul> dan moet zetten. Ik heb het php-script door een php validator gehaald en er zitten geen fouten in.

Kan je die foreachlus eens uitschrijven voor mij ?

Quae nocent docent !
 
- Ariën  -
Beheerder

- Ariën -

11/03/2016 10:46:44
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
echo "De volgende fouten zijn opgetreden:<ul>";
            foreach($errors as $error) {
                echo "<li>".$error."</li>".PHP_EOL;
            }
echo '</ul>';


HTML hoort in een echo (zoals hier), of buiten je PHP-tags.
Al eens gedacht aan een PHP-cursus? ;-)
Gewijzigd op 11/03/2016 10:47:08 door - Ariën -
 
Dirk De Coster

Dirk De Coster

11/03/2016 10:58:15
Quote Anchor link
Oké, bedankt Ariën. Ik heb dit nu aangepast. Het resultaat is weliswaar hetzelfde : van zodra ik 1 veld niet invul, kom ik op een blanco pagina terecht. Kan ik op deze pagina ergens een berichtje opnemen dat niet alle velden ingevuld zijn ? Net zoals ik een berichtje heb opgenomen dat de mail goed verzonden is ?
 
- Ariën  -
Beheerder

- Ariën -

11/03/2016 11:04:22
Quote Anchor link
Hij zou in een lijstje moeten tonen welke velden er niet ingevuld zijn.
Zet na lijn 18 anders eens dit neer:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
echo "<pre>".print_r($_POST,1)."</pre>";


Dan zie je in ieder geval welke velden er worden meegenomen door het formulier.
Update: heb net even de code uit mijn post hierboven aangepast, en heb alle ifelse'jes bij de validatie herschreven naar if. Anders zie je ze alsnog niet allemaal als er meerdere validatiefouten zijn.
Gewijzigd op 11/03/2016 11:10:29 door - Ariën -
 
Dirk De Coster

Dirk De Coster

11/03/2016 11:21:29
Quote Anchor link
Ariën, Ik heb lijn 18 bijgevoegd en de ifelse'jes aangepast en nu krijg ik bij het niet invullen van de velden deze melding :

Array
(
[name] =>
=>
[phone] =>
[message] =>
)
De volgende fouten zijn opgetreden:
Er is geen naam ingevuld
Er is geen email ingevuld
Er is geen telefoonnummer ingevuld
Er is geen bericht ingevuld


MAAR als ik alle velden invul dan krijg ik deze melding (lichtjes aangepast) in een nieuw tabblad :

Array
(
[name] => Dirk De Coster
[email] => [email protected]
[phone] => +32489995999
[message] => 3de poging
)
 
- Ariën  -
Beheerder

- Ariën -

11/03/2016 11:26:17
Quote Anchor link
Dan lijkt de validatie te kloppen, en kan die tijdelijke regel met print_r() weg.
Je moet dan ook een bericht zien of de mail wel/niet verstuurd is.
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.