upgraden naar PHP 7 - Mysqli
Eigenlijk leende ik scrips en bewerkte die en leerde op die manier PHP en mysql
Nu wil mijn hosting provider dat ik upgrade naar PHP 7. Op zich logisch, maar ja, wel weer een hele puzzel.
Het onderstaande registreer script werkt niet.
Zelf het idee dat het aan $dbid = htmlspecialchars($rij->id); ligt ... maar weet het gewoon niet wat hier aan mankeert.
Ik weet dat MD5 ook niet een geweldige veilige manier is, maar daar moet ik later mag naar kijken. Tenzij iemand hier advies heeft.
Weten jullie waarom dit script niet werkt?
Code (php)
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
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
<?
include("config.php");
if(isset($_POST['submit'])) {
// Uitvoeren
// Velden controleren
if($_POST['user'] != "" AND $_POST['pass1'] != "" AND $_POST['pass2'] != "" AND $_POST['email'] != "") {
// Gebuikersnaamcheck
$sql = "SELECT id FROM gebruikers WHERE naam='".$_POST['user']."'";
$result = mysqli_query($connection, $sql);
$tellen = mysqli_num_rows($result);
if($tellen == 0) {
// E-mailcheck
if(preg_match("/^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,6}$/i", $_POST['email'])) {
// Controle of beide ingewoerde email adressen gelijk zijn
if($_POST['pass1'] == $_POST['pass2']) {
$actcode = mt_srand((double)microtime()*100000);
while(strlen($actcode) <= 10) {
$i = chr(mt_rand (0,255));
if(eregi("^[a-z0-9]$", $i)) {
$actcode = $actcode.$i;
}
} // einde while loop
$md5pass = md5($_POST['pass1']);
$sql = "INSERT INTO gebruikers (username, password, email, status, aktief, actcode) VALUES ('".$_POST['user']."','".$md5pass."','".$_POST['email']."',0,'"."',0,'".$actcode."')";
$result= = mysqli_query($connection, $sql);
if($result == TRUE) {
$sql = "SELECT id FROM gebruikers WHERE naam='".$_POST['user']."'";
$result = mysqli_query($connection, $sql);
$rij = mysqli_fetch_object($result);
$dbid = htmlspecialchars($rij->id);
$bericht = "Activeer link";
$mail = mail($_POST['email'],"Registratie ".$sitenaam,$bericht,"From: ".$sitenaam." <".$sitemail.">");
if($mail == TRUE) {
echo "Je bent succesvol geregistreerd! Zodra je de link in de mail hebt bezocht kun je inloggen.<br />\n<a href=\"home.php\">« Naar de inlogpagina</a>";
}else{
echo "Fout opgetreden tijdens verzenden van e-mail. Neem contact op met <a href=\"mailto:".$sitemail."\">".$sitemail."</a>.";
}
}else{
echo "Er is een fout opgetreden tijdens het toevoegen van je account. Probeer het later nog eens.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "De door jou opgegeven wachtwoorden komen niet overeen.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "Het e-mailadres dat jij opgaf, komt niet overeen met hoe een e-mailadres eruit zou moeten zien ([email protected]).<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "De gebruikersnaam '".$_POST['user']."' is reeds in gebruik. Probeer een andere gebruikersnaam.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "Je bent vergeten één of meerdere velden in te vullen.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
// formulier
?>
<head>
<title>genealogie</title>
<link rel="stylesheet" type="text/css" href="famtree.css">
</head>
<body style="background: #D3D3D3; margin: 0px;">
<table width=100%>
<tr><td class="subTitle"><b>Registreren</b></td></tr>
</table>
<br>
Vul het registratie formulier hieronder in <br><br>
<form method="post" action="registreer.php">
<table>
<tr>
<td class="menu2Title">Gebruikersnaam:</td>
<td class="menu2Title"><input type="text" name="user" maxlength="50" /></td>
</tr>
<tr>
<td class="menu2Title">Wachtwoord:</td>
<td class="menu2Title"><input type="password" name="pass1" /></td>
</tr>
<tr>
<td class="menu2Title">Herhaal:</td>
<td class="menu2Title"><input type="password" name="pass2" /></td>
</tr>
<tr>
<td class="menu2Title">E-mail:</td>
<td class="menu2Title"><input type="text" name="email" maxlength="100" /></td>
</tr>
<tr>
<td></td>
<td class="menu2Title"><input type="submit" name="submit" value="Registreer" /></td>
</tr>
</table>
</form>
<small>Na de registratie zal er een e-mail naar uw e-mailadres gestuurd worden ter activatie. Tot die tijd kunt u nog niet inloggen.<br> </small>
</body>
<?
}
?>
[/quote]
include("config.php");
if(isset($_POST['submit'])) {
// Uitvoeren
// Velden controleren
if($_POST['user'] != "" AND $_POST['pass1'] != "" AND $_POST['pass2'] != "" AND $_POST['email'] != "") {
// Gebuikersnaamcheck
$sql = "SELECT id FROM gebruikers WHERE naam='".$_POST['user']."'";
$result = mysqli_query($connection, $sql);
$tellen = mysqli_num_rows($result);
if($tellen == 0) {
// E-mailcheck
if(preg_match("/^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,6}$/i", $_POST['email'])) {
// Controle of beide ingewoerde email adressen gelijk zijn
if($_POST['pass1'] == $_POST['pass2']) {
$actcode = mt_srand((double)microtime()*100000);
while(strlen($actcode) <= 10) {
$i = chr(mt_rand (0,255));
if(eregi("^[a-z0-9]$", $i)) {
$actcode = $actcode.$i;
}
} // einde while loop
$md5pass = md5($_POST['pass1']);
$sql = "INSERT INTO gebruikers (username, password, email, status, aktief, actcode) VALUES ('".$_POST['user']."','".$md5pass."','".$_POST['email']."',0,'"."',0,'".$actcode."')";
$result= = mysqli_query($connection, $sql);
if($result == TRUE) {
$sql = "SELECT id FROM gebruikers WHERE naam='".$_POST['user']."'";
$result = mysqli_query($connection, $sql);
$rij = mysqli_fetch_object($result);
$dbid = htmlspecialchars($rij->id);
$bericht = "Activeer link";
$mail = mail($_POST['email'],"Registratie ".$sitenaam,$bericht,"From: ".$sitenaam." <".$sitemail.">");
if($mail == TRUE) {
echo "Je bent succesvol geregistreerd! Zodra je de link in de mail hebt bezocht kun je inloggen.<br />\n<a href=\"home.php\">« Naar de inlogpagina</a>";
}else{
echo "Fout opgetreden tijdens verzenden van e-mail. Neem contact op met <a href=\"mailto:".$sitemail."\">".$sitemail."</a>.";
}
}else{
echo "Er is een fout opgetreden tijdens het toevoegen van je account. Probeer het later nog eens.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "De door jou opgegeven wachtwoorden komen niet overeen.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "Het e-mailadres dat jij opgaf, komt niet overeen met hoe een e-mailadres eruit zou moeten zien ([email protected]).<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "De gebruikersnaam '".$_POST['user']."' is reeds in gebruik. Probeer een andere gebruikersnaam.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
echo "Je bent vergeten één of meerdere velden in te vullen.<br />\n<a href=\"javascript:history.back()\">« Ga terug</a>";
}
}else{
// formulier
?>
<head>
<title>genealogie</title>
<link rel="stylesheet" type="text/css" href="famtree.css">
</head>
<body style="background: #D3D3D3; margin: 0px;">
<table width=100%>
<tr><td class="subTitle"><b>Registreren</b></td></tr>
</table>
<br>
Vul het registratie formulier hieronder in <br><br>
<form method="post" action="registreer.php">
<table>
<tr>
<td class="menu2Title">Gebruikersnaam:</td>
<td class="menu2Title"><input type="text" name="user" maxlength="50" /></td>
</tr>
<tr>
<td class="menu2Title">Wachtwoord:</td>
<td class="menu2Title"><input type="password" name="pass1" /></td>
</tr>
<tr>
<td class="menu2Title">Herhaal:</td>
<td class="menu2Title"><input type="password" name="pass2" /></td>
</tr>
<tr>
<td class="menu2Title">E-mail:</td>
<td class="menu2Title"><input type="text" name="email" maxlength="100" /></td>
</tr>
<tr>
<td></td>
<td class="menu2Title"><input type="submit" name="submit" value="Registreer" /></td>
</tr>
</table>
</form>
<small>Na de registratie zal er een e-mail naar uw e-mailadres gestuurd worden ter activatie. Tot die tijd kunt u nog niet inloggen.<br> </small>
</body>
<?
}
?>
[/quote]
Wat me aan bovenstaande opvalt:
- short tags: gebruik "< ?php" ipv "< ?" (maar dan zonder spatie tussen "<" en "?", maar anders ging de opmaak brak)
- op regel 32 staat een dubbele "="
Gewijzigd op 29/05/2018 19:08:49 door Rob Doemaarwat
Gebruik escaping-functionaliteit voor DATA in je SQL. En gebruik dit altijd in combinatie met quotes. Het een is niet veilig zonder het ander.
Escape ook pas zaken (ook in HTML) wanneer dit pas nodig is, dit is doorgaans vlak voor gebruik. Om ergens op voorhand htmlspecialchars() omheen te gooien lijkt mij niet verstandig.
Misschien is dit ook een uitgelezen moment om je eens te verdiepen in character encoderingen, want functies als htmlspecialchars() maar ook database-escaping-functies zijn hier sterk afhankelijk van. Daarnaast is over de PHP-versies stilzwijgend de default character encoding die htmlspecialchars() gebruikt veranderd. Mogelijk wijkt deze af van de character encoding die je verder binnen je website gebruikt... Ook is het zaak dat je expliciet een character encoding instelt bij het maken van een database-verbinding zodat MySQL ook weet in welk format deze informatie ontvangt en in welk format deze informatie dient te retourneren.
Je zult ons ook wat meer moeten helpen dan enkel met een "het werkt niet". Wat gaat er mis, en waar blijkt dit uit. De code-snippet hierboven van @Rob kan je mogelijk helpen bij het lokaliseren van fouten.
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in registreer.php on line 14
Fatal error: Uncaught Error: Call to undefined function eregi() in registreer.php:25 Stack trace: #0 {main} thrown in registreer.php on line 25
@2: Die functie bestaat niet meer. Het is nu preg_match(), maar dan moet je wel een delimiter toevoegen.
Maar wat Thomas ook al aangaf: Dit moet je zo niet meer live willen zetten. Het is een paradijsje voor een hacker ...
Zeker met die nieuwe privacy wet moet je extra voorzichtig zijn.
Ik heb zelf niet genoeg kennis om een veiliger iets te maken. En de scripts online zijn vaak verouderd.
Denk dat ik het maar offline houd.
Gewijzigd op 29/05/2018 21:32:15 door Theo Huitema