Termine auf Prepared Statements umgebaut
Kalender, Terminliste, Terminformular und Terminzettel laufen ueber db_abfrage() mit Platzhaltern; das Anlegen einer mehrtaegigen Terminreihe liegt in einer Transaktion. Die Logik steckt jetzt in incs/termin.php, sites/termin*.php rufen sie nur noch auf. Dabei behoben: - SQL-Injektion ueber die Suchbegriffe der Terminliste, ueber die Mehrfachauswahl (Ankreuzfelder del<N>/erl<N> gingen roh in DELETE bzw. UPDATE), ueber die Wiedervorlage-Tage (INTERVAL $folgedays DAY) und ueber ?action=terminshow&id=... in maketerminarray(), maketerminadresse(), maketelnrn() und makegooglestring() - gespeichertes XSS: Beschreibung, Notiz, Termintyp, Ort, Kundenname und Mitarbeiterfarbe im Kalender, in der Terminliste und im Formular - "or $err=error(...)" stand innerhalb des Abfrage-Strings, dadurch wurden die Nebenzeilen einer Terminreihe beim Loeschen nie entfernt - die Abfrage zum Folgetermin las eine Spalte typ_id, die es in termin nicht gibt; Typ und Wiedervorlage fehlten deshalb beim Bearbeiten - ein Folgetermin wurde mit termtime='' und termdauer='' angelegt, ein Termin ohne Folgetermin mit followed_by='' - im strikten Modus Fehler - ein Termin ohne Datum landete auf dem 01.01.1970 und gab dabei "NICHTTERMINIERT!!" mitten in die Seite aus - die Ueberschneidungspruefung verglich ab dem zweiten Tag gegen das Ende des ersten Tages - eine unbekannte Registerkarte der Terminliste ergab ein leeres WHERE und damit einen SQL-Fehler; jetzt gilt die Standardansicht - terminshow.php pruefte den Typ mit = statt == - der Kalender haengt nicht mehr an der Locale de_DE (strftime) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+38
-64
@@ -1,71 +1,45 @@
|
||||
<?php
|
||||
// GET: id OR date;type
|
||||
<?php
|
||||
/*
|
||||
* Terminzettel als PDF: eine Seite je Termin, einmal zum Abheften und
|
||||
* einmal mit Anfahrtsskizze. Aufruf entweder mit id (ein Termin) oder mit
|
||||
* date (alle Termine eines Tages).
|
||||
*/
|
||||
require_once "incs/termin.php";
|
||||
include("incs/makepdf.php");
|
||||
|
||||
$pdf = makerawPDFcopy(0);
|
||||
if($_GET["id"] && !$_GET["date"])
|
||||
{
|
||||
$termin=maketerminarray($dbconn, $_GET["id"]);
|
||||
$adresse=maketerminadresse($dbconn, $_GET["id"]);
|
||||
$telnrn=maketelnrn($dbconn,$_GET["id"]);
|
||||
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
|
||||
}
|
||||
elseif($_GET["date"])
|
||||
{
|
||||
$qry=mysqli_query($dbconn,"SELECT id FROM termin WHERE adresse_id AND DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime($_GET["date"]))."' ORDER BY termtime ASC");
|
||||
if($_GET["type"]="singlepages")
|
||||
{
|
||||
$prevpage=0;
|
||||
while($res=mysqli_fetch_assoc($qry))
|
||||
{
|
||||
if($prevpage)
|
||||
$pdf->addpage();
|
||||
$prevpage=1;
|
||||
$termin=maketerminarray($dbconn, $res["id"]);
|
||||
$adresse=maketerminadresse($dbconn, $res["id"]);
|
||||
$telnrn=maketelnrn($dbconn,$res["id"]);
|
||||
makesingleterminpage($pdf,$termin,$adresse,$telnrn,0);
|
||||
}
|
||||
}
|
||||
}
|
||||
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
|
||||
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
|
||||
$smarty->assign("pdffile","./temp/pdftemp/$tmppdfname.pdf");
|
||||
$terminid = parameterGanzzahl("id");
|
||||
$datum = isset($_GET["date"]) && is_string($_GET["date"]) ? date("Y-m-d", strtotime($_GET["date"])) : "";
|
||||
|
||||
$pdf = makerawPDFanfahrt(0);
|
||||
if($_GET["id"] && !$_GET["date"])
|
||||
$ids = array();
|
||||
if($terminid && !$datum)
|
||||
$ids[] = $terminid;
|
||||
elseif($datum)
|
||||
{
|
||||
$termin=maketerminarray($dbconn, $_GET["id"]);
|
||||
$adresse=maketerminadresse($dbconn, $_GET["id"]);
|
||||
$googleadresse=makegooglestring($dbconn, $_GET["id"]);
|
||||
$telnrn=maketelnrn($dbconn,$_GET["id"]);
|
||||
makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse);
|
||||
$zeilen = db_zeilen($dbconn, "SELECT id FROM termin WHERE adresse_id != 0 AND DATE(termtime) = ? ORDER BY termtime ASC", array($datum));
|
||||
foreach((array)$zeilen as $z)
|
||||
$ids[] = $z["id"];
|
||||
}
|
||||
elseif($_GET["date"])
|
||||
{
|
||||
$qry=mysqli_query($dbconn,"SELECT id FROM termin WHERE adresse_id AND DATE_FORMAT(termtime,'%Y%m%d') = '".date("Ymd",strtotime($_GET["date"]))."' ORDER BY termtime ASC");
|
||||
if($_GET["type"]="singlepages")
|
||||
{
|
||||
$prevpage=0;
|
||||
while($res=mysqli_fetch_assoc($qry))
|
||||
{
|
||||
if($prevpage)
|
||||
$pdf->addpage();
|
||||
$prevpage=1;
|
||||
$termin=maketerminarray($dbconn, $res["id"]);
|
||||
$adresse=maketerminadresse($dbconn, $res["id"]);
|
||||
$googleadresse=makegooglestring($dbconn,$res["id"]);
|
||||
$telnrn=maketelnrn($dbconn,$res["id"]);
|
||||
makesingleterminpage($pdf,$termin,$adresse,$telnrn,1,$googleadresse);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
$tmppdfname = str_replace(array(" ","."),array("_","_"),microtime());
|
||||
savePDF($pdf,"./temp/pdftemp/$tmppdfname.pdf");
|
||||
$smarty->assign("pdffile2","./temp/pdftemp/$tmppdfname.pdf");
|
||||
|
||||
/* $anfahrt = 0 für den Terminzettel, 1 für die Seite mit der Karte */
|
||||
function terminzettel($dbconn, $ids, $anfahrt)
|
||||
{
|
||||
$pdf = $anfahrt ? makerawPDFanfahrt(0) : makerawPDFcopy(0);
|
||||
$erste = true;
|
||||
foreach($ids as $id)
|
||||
{
|
||||
if(!$erste)
|
||||
$pdf->addpage();
|
||||
$erste = false;
|
||||
$googleadresse = $anfahrt ? makegooglestring($dbconn, $id) : "";
|
||||
makesingleterminpage($pdf, maketerminarray($dbconn, $id), maketerminadresse($dbconn, $id),
|
||||
maketelnrn($dbconn, $id), $anfahrt, $googleadresse);
|
||||
}
|
||||
$name = str_replace(array(" ", "."), array("_", "_"), microtime());
|
||||
savePDF($pdf, "./temp/pdftemp/$name.pdf");
|
||||
return "./temp/pdftemp/$name.pdf";
|
||||
}
|
||||
|
||||
$smarty->assign("pdffile", terminzettel($dbconn, $ids, 0));
|
||||
$smarty->assign("pdffile2", terminzettel($dbconn, $ids, 1));
|
||||
$smarty->display("terminshow.tpl");
|
||||
|
||||
|
||||
?>
|
||||
?>
|
||||
|
||||
Reference in New Issue
Block a user