Hoi,

Ik heb een afwezigheidskalender voor onze club gemaakt. Alles werkt zoals ik verwacht.
concept:
* Enkel dinsdagen
* 6*8 (48) weken
* Start eerste dinsdag van september
De leden kunnen inloggen en hun afwezigheden invullen
De beheerders kunnen alle gegevens aanpassen(afwezigheden en meldingen)
Mijn vraag voor reviewers :) is het veilig en wat kan ik nog verbeteren voor de veiligheid.
Ik weet dat er styles aanwezig zijn in het PHP bestand. dit is om minder te moeten wisselen van bestand. dat komt later in orde.

De functie opendatabasei() is gewoon inloggen op de database en een link terug geven.
De code is compleet (denk ik) op bovenvernoemde functie na.

<?php
	setlocale(LC_TIME, 'NL_be');
	session_name("afwezig");
	session_start();
  
	$logedIn=false;
	$adminLevel=0;
	$un='';
  
	if(isset($_SESSION['myusername']))
	{
    $un=$_SESSION['myusername'];
		setcookie ( "Naam" , $_SESSION['myusername'],mktime(18, 30, 0, 5, 12, 2020 ),"/");
    $logedIn=true;
	}
  
	include ('../php/define.php');
	include ('../php/functions.php');
	require_once('../php/PHPMailer/class.phpmailer.php');
	$con = opendatabasei();
	function fout($msg){
		echo '<div class="error">' . $msg . '</div>';
	}
	function sendMail($wie, $datum){
		$pos = strpos ($_SERVER['SERVER_NAME'], ".local/");//geen mail op local test systeem
		if ($pos === false){
			return;
		}
		//------------------------------------------//
		$mail = new PHPMailer();
		$mail->IsSMTP(); 			// telling the class to use SMTP
		$mail->SMTPAuth   = false;
		$mail->Host       = "beep.beep.beep"; 
		$mail->Port       = "25";
		$mail->SMTPSecure = "";
		$mail->Username   = '[email protected]'; 	// SMTP account username
		$mail->Password   = 'beeeeeeeeeeeep';   // SMTP account password
		$mail->SMTPDebug  = 0;
		// 1 = errors and messages
		// 2 = messages only
		//---------------------------------------------------
		$sql = '
			SELECT 
				voornaam, 
				achternaam, 
				email, 
				functie
			FROM 
				`post_leden` 
			JOIN 
				post_emails ON post_leden.id = post_emails.id
			WHERE 
				admin >0';
		$con = opendatabasei();
		$result=mysqli_query($con, $sql);
		if ($result){
			while(list($vnaam, $anaam, $email, $functie)= mysqli_fetch_row($result)){
				$mail->AddAddress($email, $functie);
			}
			$MessageBody  = 'Toernooileider,<br><br>';
			$MessageBody .= $_SESSION['myusername'] . ' laat weten dat ' . $wie . ' niet kan komen op ' . $datum . '<br><br>';
			$MessageBody .= 'De website<br>PS: Gelieve niet te antwoorden op dit automatisch bericht.<br><br><br><br>';
			
			$MessageBody .= '<b>info</b> IP: ' .$_SERVER['REMOTE_ADDR'] . "\n<br>";
			$MessageBody .= 'Adres: ' . $_SERVER['SERVER_NAME'] . '/' . $_SERVER['REQUEST_URI'] . "\n";
		
		
			$mail->MsgHTML($MessageBody);
			 
			$mail->SetFrom(admin_email, clubNaam); 
			$mail->AddReplyTo(admin_email, clubNaam);
			$mail->Subject    = clubNaam .' Afwezigheid ' . $wie;
			$mail->Send();
		}
	}
		  	
	if (date("j")<8){
		$date =  mktime(0, 0, 0, 8, 31, date('Y')-1);
	}else{        
		$date =  mktime(0, 0, 0, 8, 31, date('Y'));
	}
	while (date('N', $date)<>2){
		$date = $date + 1;
	}
?>
<!doctype html>
<html lang="nl-be">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8">
    <meta NAME="author" content="JanR.be">
    <title>
      Afwezigheidskalender <?php echo date('Y', $date) . '-' . (date('Y', $date) + 1); ?>
    </title>
    <style>    
		label {
			display:block;
			float:left;
			width:300px;
		}
		td.datum{
			width:200px;
			font-weight: bold;
			border-bottom-style: none ;
			font-size: 200%;
		}
		td.naam{
			border-top-style: none ;
			height:50px;
			color: blue;
		}
		hr {
			height: 6px;
			background-color: red;
			border: 2px; 
		}
		div.error{
			font-size: 200%;
			color: red;
			font-weight: bold;
		}
		ul.kies {
			width:100%;
			background-color: #ff9933;
			font-weight: bold;
			text-align: left;
		}
		li.kies {
			float: left;
			width: 400px;
			list-style: none;
		}
		li.clear {
			clear: both;
			float: none;
		}
		ul.kies li.kies:hover a{
			color:yellow;
			background-color:red;
			width:180px;
		}
    </style>
    <link rel="stylesheet" type="text/css" id="css_style" href="style.css"> 
    <link rel="stylesheet" type="text/css" media="print" id="css_printstyle" href="printstyle.css"> 
	
    <script type="text/javascript" src="menu.php"></script>
    <script>
		function verwijder(nr){
			back=readFile('verwijder.php?id=' + nr);
			if (!back==''){
				alert(back);
				return false;
			}else{
				reloadlater();
			}
		}

		function komtToch(nr){
			back=readFile('komttoch.php?id=' + nr);
			if (!back==''){
				alert(back);
				return false;
			}else{
				reloadlater();
			}
		}
      
		function reloadlater(){
			setTimeout(function() {window.location=window.location;},1000);
		}
		function readFile(url) {
			pageRequest = new XMLHttpRequest();
			pageRequest.open('GET', url, false);
			pageRequest.send(null);
			return pageRequest.responseText;
		}
    </script>
  </head>
  <body>
    <form id='login' action="AfwezigheidsKalender.php" method="post" class="hide">
    <br><br><br><br><br>
    <?php		
        if($_SERVER['REQUEST_METHOD'] == "POST"){
			if(isset($_POST['myusername'], $_POST['mypassword'])){
				$myusername=$_POST['myusername'];
				$mypassword=$_POST['mypassword'];

				// To protect MySQL injection (more detail about MySQL injection)
				$myusername = stripslashes($myusername);
				$mypassword = stripslashes($mypassword);
				$myusername = mysqli_real_escape_string($con, $myusername);
				$mypassword = mysqli_real_escape_string($con, $mypassword);
				
				$sql="SELECT post_leden.ID, post_leden.admin FROM post_emails INNER JOIN post_leden ON post_emails.ID = post_leden.ID WHERE ((post_emails.email='$myusername') and (password='".hash("sha512",$mypassword)."'))";
				// echo $sql . "<br>";
				$result=mysqli_query($con, $sql);
				if ($result){
				// Mysql_num_row is counting table row
				  $count=mysqli_num_rows($result);
				}else{
				  $count=0;
				}
				if($count==1){
					$_SESSION['myusername']=$myusername;
					echo "<a href='AfwezigheidsKalender.php'>Ga verder</a>";
					echo "<script type=\"text/javascript\">window.location.href='AfwezigheidsKalender.php';</script>";// opnieuw laden
					list($id, $admin)= mysqli_fetch_row( $result);
					$_SESSION['id']=$id;
					$_SESSION['admin']=$admin;
				}else{
					echo 'Foutieve inlog gegevens!<br>';
				}
			}elseif (isset($_POST['afwezig'], $_POST['id'])){
				if (is_numeric($_POST['id'])){
					$id = $_POST['id'];
					$afwezig=$_POST['afwezig'];
					if ($afwezig!=''){
						$afwezig = stripslashes($afwezig);
						$afwezig = mysqli_real_escape_string($con, $afwezig);
						str_replace('-','/',$afwezig);
						str_replace(' ','/',$afwezig);
						str_replace('.','/',$afwezig);
						str_replace('\\','/',$afwezig);
						$afwezig=explode("/", $afwezig);
						if (checkdate($afwezig[1],$afwezig[0],$afwezig[2])){
							$a=mktime(0, 0, 0, $afwezig[1],$afwezig[0],$afwezig[2]);
							if ( date("w", $a)==2){
							if (isset($_POST['opmerking'])){
								$opmerking=$_POST['opmerking'];
								$opmerking = stripslashes($opmerking);
								$opmerking = mysqli_real_escape_string($con, $opmerking);
							}else{
								$opmerking = stripslashes($opmerking);
								$opmerking = mysqli_real_escape_string($con, $opmerking);
							}
						
								$sql='CREATE TABLE  IF NOT EXISTS afwezig (
									ID int(11) NOT NULL AUTO_INCREMENT,
									NaamID  int(11) NOT NULL ,
									Datum date NOT NULL,
									Afwezig boolean NOT NULL,
									opmerking varchar(50) COLLATE utf8_bin NOT NULL,
									PRIMARY KEY (ID),
									UNIQUE KEY NaamID (Datum, NaamID)
									) ENGINE=MyISAM DEFAULT CHARSET=armscii8;';
								$result=mysqli_query($con, $sql);
									
								$afwezig=date("Ymd", $a);
								//$sql='INSERT INTO `messages` (`Datum` , `message`) VALUES ( '. $msgDate .', "' . $msgText . '") ';
								$sql='INSERT INTO `afwezig` ( `NaamID` , `Datum` , `Afwezig` , `opmerking`) VALUES (' . $id . ', '. $afwezig .', TRUE, "' . $opmerking . '") ';
								mysqli_query($con, $sql);
								
								$sql = 'select voornaam, achternaam from post_leden where id=' . $id;
								$result=mysqli_query($con, $sql);
								if ($result){
									$d = date("l F Y", $a);
									$d = strftime('%A %e %B %G', $a);
									/*
									A = dag voluit
									e = dag vd maand
									B = maand voluit
									G = jaar 4 cijfers
									*/
									list($vnaam, $anaam)= mysqli_fetch_row($result);
									sendMail($vnaam .' ' . $anaam, $d);
								}
							}else{
								fout('Dit is geen dinsdag!');
							}
						}else{
							fout( 'Dit is geen correcte datum!');
						}
					}else{
						fout( 'Geen datum opgegeven!');
					}
				}else{
					fout( 'Fout in de ingaven!');
				}
			}elseif (isset($_POST['msgDate'],$_POST['msgText'])){
				if ($_POST['msgDate']!=''){
					$msgDate=$_POST['msgDate'];
					$msgText=$_POST['msgText'];
					
					if ($msgDate!='' && $msgText !=''){
						$msgText = stripslashes($msgText);
						$msgText = mysqli_real_escape_string($con, $msgText);
						if (isset($_POST['msgOpmerking'])){
							$opmerking=$_POST['msgOpmerking'];
							$opmerking = stripslashes($opmerking);
							$opmerking = mysqli_real_escape_string($con, $opmerking);
						}else{
							$opmerking = stripslashes($opmerking);
							$opmerking = mysqli_real_escape_string($con, $opmerking);
						}
						
						$msgDate = stripslashes($msgDate);
						$msgDate = mysqli_real_escape_string($con, $msgDate);
						str_replace('-','/',$msgDate);
						str_replace(' ','/',$msgDate);
						str_replace('.','/',$msgDate);
						str_replace('\\','/',$msgDate);
						$msgDate=explode("/", $msgDate . '////');
						if (is_numeric($msgDate[1]) && is_numeric($msgDate[0]) && is_numeric($msgDate[2])){
							if (checkdate($msgDate[1],$msgDate[0],$msgDate[2])){
								$a=mktime(0, 0, 0, $msgDate[1],$msgDate[0],$msgDate[2]);
								if ( date("w", $a)==2){
									$msgDate=date("Ymd", $a);
									$sql='CREATE TABLE  IF NOT EXISTS messages (
									  ID int(11) NOT NULL AUTO_INCREMENT,
									  Datum date NOT NULL,
									  message varchar(50) COLLATE utf8_bin NOT NULL,
									  opmerking varchar(50) COLLATE utf8_bin NOT NULL,
									  PRIMARY KEY (ID),
									  UNIQUE KEY NaamID (Datum, message)
									) ENGINE=MyISAM DEFAULT CHARSET=armscii8;';
									$result=mysqli_query($con, $sql);

									$sql='INSERT INTO `messages` (`Datum` , `message`, `opmerking`) VALUES ( '. $msgDate .', "' . $msgText . '", "' . $opmerking . '") ';
									//echo $sql;
									mysqli_query($con, $sql);
								}else{
									fout('Dit is geen dinsdag!');
								}
							}else{
								fout( 'Dit is geen correcte datum!');
							}
						}else{
							fout( 'Dit is geen datum!');
						}
					}else{
						fout( 'Geen datum of tekst opgegeven!');
					}
				}else{
					fout( 'Fout in de ingaven!');
				}
			}			
        }
        
        if($logedIn){
			echo 'Ingelogd als: ' . $un;
			echo '<input type="button" value="uitloggen" onClick="location.href=\'logout.php\'">';
			echo '<br>';
          
			echo '<select id="id" name="id"  title="Kies de afwezige speler.">';
			$sql='select id,voornaam,achternaam from post_leden  where actief=true order by voornaam,achternaam';
			$result=mysqli_query($con, $sql);
			if ($result){
				while(list($id, $vnaam, $anaam)= mysqli_fetch_row($result)){
					echo '<option ';
					if ($id==$_SESSION['id']){
						echo ' selected ';
					}

					if ($id!=$_SESSION['id'] && $_SESSION['admin']<=0){
						echo ' disabled ';
					}
					echo 'value="'. $id .'">' . $vnaam . ' ' . $anaam . '</option>';
				}
			}

			echo '</select> is afwezig op: ';
			echo '<input name="afwezig" type="date" id="afwezig" title="Vul hier de datum in. formaat dd/mm/jjjj"> 
				<input title="De opmerking mag max. 50 karakters zijn. Deze verschijnt als je met de muis boven de getoonde tekst zweeft." type="text" name="opmerking" id="opmerking"> 
				<input name="submit" type="submit" id="submit" value="Verstuur">
				</form><br>';
			
			if ($_SESSION['admin']!=0){
				echo '<form id="msg" action="AfwezigheidsKalender.php" method="post" class="hide">
						Melding voor 
						<input name="msgDate" type="date" id="msgDate" title="Vul hier de datum in. formaat dd/mm/jjjj"> 
						<input title="De Tekst mag max. 50 karakters zijn." type="text" name="msgText" id="msgText"> 
						<input title="De opmerking mag max. 50 karakters zijn. Deze verschijnt als je met de muis boven de getoonde tekst zweeft." type="text" name="msgOpmerking" id="msgOpmerking"> 
						<input name="submit" type="submit" id="submit2" value="Verstuur">
					</form>';
			}
		}else{
			echo 'login:<input name="myusername" type="text" id="myusername">Paswoord:<input name="mypassword" type="password" id="mypassword"> <input type="submit" value="Log in"></form>';
        }
        $sql='
			SELECT afwezig.id, 
				post_leden.id, 
				voornaam, 
				achternaam, 
				DATE_FORMAT(datum, "%d/%m/%Y") as datum
            FROM afwezig
            INNER JOIN 
				post_leden on post_leden.ID = afwezig.naamid';
        if (!isset($_SESSION['admin']) || $_SESSION['admin']==0){//niet ingelogd of geen admin
			if (isset($_SESSION['admin'])){
				$id=$_SESSION['id'];
			}else{
				$id=-1;
			}
            $sql .=' where post_leden.id=' . $id . 'and datum>=' . date('Ymd',$date) . ' and datum<=' . date('Ymd',strtotime("+364 day", $date));
        }else{//wel admin dus ook de meldigen beheren
            $sql .=' where datum>=' . date('Ymd',$date) . ' and datum<=' . date('Ymd',strtotime("+364 day", $date));
			
			$sqlMSG='select id, DATE_FORMAT(datum, "%d-%m-%Y"), message from messages';
            $sqlMSG .=' where datum>=' . date('Ymd',$date) . ' and datum<=' . date('Ymd',strtotime("+364 day", $date));
			$sqlMSG .=' order by datum, message';
			
			$resultMSG = mysqli_query($con, $sqlMSG); 
			if ($resultMSG){
				echo '<ul class="kies hide">';
				while(list($id, $datum, $msg)= mysqli_fetch_row($resultMSG)){
				  echo '<li class="kies"><input type="button" value="Verwijder" onClick="verwijder(' . $id . ')">' . ' ' . $msg . ' (' . $datum . ')</li>';
				}
				echo '<li class="clear kies"></li></ul>';
			}
		}
		$sql .=' order by datum, achternaam, voornaam';
		$result=mysqli_query($con, $sql);

		if ($result){
			echo '<ul class="kies hide">';
            while(list($afwezigID, $id, $vnaam, $anaam, $datum)= mysqli_fetch_row($result)){
              echo '<li class="kies"><input type="button" value="Ik kom toch" onClick="komtToch(' . $afwezigID . ')">' . ' ' . $vnaam . ' ' . $anaam . ' (' . $datum . ')</li>';
            }
			echo '<li class="clear kies"></li></ul>';
        }
      ?>
	<br><br>
	<hr>
    <table>
      <?php        
        for ($j = 1; $j < 9; $j++) {
          echo '<tr>';
          $rij2='<tr>';
          for ($i = 1; $i <= 6; $i++) {
            $rij2.='<td  class="naam">';
            echo '<td class="datum">'. date('d/m/Y',$date) .'</td>';
            
			
			$sql='select message,opmerking
              FROM messages where datum='.date('Ymd',$date);
            $result=mysqli_query($con, $sql);
            
            if ($result){
              while(list($msg, $MSGopmerking)= mysqli_fetch_row($result)){
                $rij2.= '<div style="color:red;"';
				if ($MSGopmerking !=''){
					$rij2.= ' title="'.$MSGopmerking.'"';
				}
				$rij2.= '>' . $msg . '</div>';
              }
            }
			
			
            $sql='select voornaam, achternaam, opmerking
              FROM afwezig
              INNER JOIN post_leden
              on post_leden.ID = afwezig.naamid  where datum='.date('Ymd',$date).' order by achternaam, voornaam';
              //echo $sql .'<br>';
            $result=mysqli_query($con, $sql);
            
            if ($result){
              while(list($vnaam, $anaam, $opmerking)= mysqli_fetch_row($result)){
                $rij2.= '<div';
				if ($opmerking !=''){
					$rij2.= ' title="'.$opmerking.'"';
				}
				$rij2.= '>' . $vnaam. ' ' . $anaam . '</div>';
              }
            }
          
            $rij2.='</td>'; 
            $date = strtotime("+7 day", $date);
          }
          echo $rij2 . '</tr>';
        }
      ?>
    </table>      
  </body>
</html>
<?php
	mysqli_close($con); 
?>


Bedankt Jan

Reageren