So, das Script ist installiert und wurde aufgerufen. Bei eingeschaltetem Debugmodus ist die Seite erstmal voll mit Fehlermeldungen:
Notice: Undefined variable: sitename in /modules/Usersuche/index.php on line 49
Notice: Undefined index: bday_day in /modules/Usersuche/index.php on line 95
Notice: Undefined index: bday_month in /modules/Usersuche/index.php on line 106
Notice: Undefined index: user_sexus in /modules/Usersuche/index.php on line 128
Notice: Undefined index: user_sexus in /modules/Usersuche/index.php on line 130
Notice: Undefined index: user_famstatus in /modules/Usersuche/index.php on line 139
Notice: Undefined index: user_smoke in /modules/Usersuche/index.php on line 163
usw....
Notice: Undefined variable: sitename in /modules/Usersuche/index.php on line 49
$sitename ist eine globale Variable aus der config.php, sie muss in der Funktion global verfügbar sein.
also
global $sitename;
in der Funktion init() zufügen
Notice: Undefined index: bday_day in /modules/Usersuche/index.php on line 95
Notice: Undefined index: bday_month in /modules/Usersuche/index.php on line 106
Notice: Undefined index: user_sexus in /modules/Usersuche/index.php on line 128
usw....
Diese Array-Indexe sind nur vorhanden, wenn das Formular über Post abgesendet wurde und sich selbst wieder aufruft. Es müsste also vor Verwendung der Variablen-Indexe geprüft werden, ob diese überhaupt vorhanden sind. Hier eigentlich nur unschön, aber sauberes Coding ist das nicht und kann unter anderen Umständen zu schweren Sicherheitslücken führen. Das sollte man sich erst garnicht angewöhnen.
Also z.B. diese Zeile:
<option value='0'<? if($_POST["user_sexus"] == "0") echo " selected"; ?>>nicht angegeben</option>
wie folgt abändern
<option value='0'<? if(isset($_POST["user_sexus"]) && $_POST["user_sexus"] == "0") echo " selected"; ?>>nicht angegeben</option>
Ich habe jetzt, dass es schneller geht, folgende Konstrukt in die Funktion eingabe() eingefügt:
if(empty($_POST['uname'])) $_POST['uname'] = '';
if(empty($_POST['realname'])) $_POST['realname'] = '';
if(empty($_POST['user_from'])) $_POST['user_from'] = '';
if(empty($_POST['bday_day'])) $_POST['bday_day'] = '';
if(empty($_POST['bday_month'])) $_POST['bday_month'] = '';
if(empty($_POST['bday_year'])) $_POST['bday_year'] = '';
if(empty($_POST['user_partneralter1'])) $_POST['user_partneralter1'] = '';
if(empty($_POST['user_partneralter2'])) $_POST['user_partneralter2'] = '';
if(empty($_POST['user_sexus'])) $_POST['user_sexus'] = '';
if(empty($_POST['user_famstatus'])) $_POST['user_famstatus'] = '';
if(empty($_POST['user_heigh1'])) $_POST['user_heigh1'] = '';
if(empty($_POST['user_heigh2'])) $_POST['user_heigh2'] = '';
if(empty($_POST['user_gewicht1'])) $_POST['user_gewicht1'] = '';
if(empty($_POST['user_gewicht2'])) $_POST['user_gewicht2'] = '';
if(empty($_POST['user_haar'])) $_POST['user_haar'] = '';
if(empty($_POST['user_augen'])) $_POST['user_augen'] = '';
if(empty($_POST['user_smoke'])) $_POST['user_smoke'] = '';
if(empty($_POST['user_alkohol'])) $_POST['user_alkohol'] = '';
if(empty($_POST['user_piercing'])) $_POST['user_piercing'] = '';
if(empty($_POST['user_tatto'])) $_POST['user_tatto'] = '';
if(empty($_POST['user_sucht'])) $_POST['user_sucht'] = '';
if(empty($_POST['user_beziehung'])) $_POST['user_beziehung'] = '';
if(empty($_POST['user_partnerfigur'])) $_POST['user_partnerfigur'] = '';
if(empty($_POST['ausgabe'])) $_POST['ausgabe'] = '';
Das ist Geschmacksache und ist sicher besser zu machen...
So, jetzt zur eigentlichen Suchfunktion.
Grundsätzlich sollte die Usertabelle über den User-Prefix angesprochen werden. Also in die Funktion search() folgendes hinzufügen:
global $user_prefix;
und in sämtlichen Datenbankabfragen, in denen die Usertabelle angesprochen wird den Namen der Usertabelle mit dem user_prefix anstatt dem prefix ergänzen.
Dann finden sich Konstrukte in der Art in der Suchfunktion:
if(!empty($_POST["uname"])){
$sql.=" && uname LIKE '%".trim($_POST["uname"])."%'";
}
if(!empty($_POST["user_heigh1"])){
$sql.=" && user_heigh > ".trim($_POST["user_heigh1"]);
}
Der Operator && ist zwar in mysql toleriert, aber normalerweise sollte das Schlüsselwort AND verwendet werden.
Desweiteren sollten Usereingaben auf jeden Fall auf Gültigkeit überprüft werden und Sonderzeichen "escaped" werden. Bei einer Suchfunktion, in denen beliebige Strings über Formulare eingegeben werden können, ist natürlich nicht viel auf Gültigkeit zu überprüfen. Evtl. könnte man Sonderzeichen ausfiltern und die Länge beschränken. Der USername darf z.B. nur 25 Zeichen lang sein. Das ist hier jetzt aber zu komplex, um das vollständig zu behandeln.
Zum escapen der Sonderzeichen empfiehlt sich in pragmaMx die API-Funktion mxAddSlashesForSQL(). Übergabevariablen, die normalerweise nur eine Zahl enthalten dürfen, können z.B. mit intval() zwangsweise in eine Zahl umgewandelt werden.
Die oben genannten Zeilen würden dann etwa so aussehen:
if(!empty($_POST["uname"])){
$sql.=" AND uname LIKE '%".trim(mxAddSlashesForSQL(substr($_POST["uname"], 0, 25)))."%'";
}
if(!empty($_POST["user_heigh1"])){
$sql.=" AND user_heigh > ".intval($_POST["user_heigh1"]);
}
Die eigentliche Datenbankabfrage, weiter unten,
$result=mysql_query($sql);
$Anzahl=mysql_num_rows($result);
$sql=$sql." order by uname ASC limit ".$_POST["Anfangsposition"].",".$ZeilenProSeite;
$result=mysql_query($sql);
muss in pragmaMx mit der API-Funktion sql_query() erfolgen, nicht wie in dem Script mit der normalen PHP-Funktion mysql_query(). Nur so greift der volle Schutz durch das integrierte Detection System. Konsequenterweise sollten dann auch die anderen Datenbankfunktionen der pragmaMx-Datenbank-API (sql_layer.php) verwendet werden.
Auch in der Limit-Begrenzung der Datenbankabfrage lauert eine Sicherheitslücke. Die beiden Parameter Start und Anzahl für das Limit dürfen nur eine Zahl sein. Ein Hacker könnte hier durch das einschleusen von einem String die Abfrage manipulieren.
Die abgeänderten Zeilen würden dann so aussehen:
$result=sql_query($sql);
$Anzahl=sql_num_rows($result);
$sql=$sql." order by uname ASC limit ".intval($_POST["Anfangsposition"]).",".intval($ZeilenProSeite);
$result=sql_query($sql);
Das war's erstmal grob zur Sicherheit. Ich denke da kommen jetzt sicher noch Fragen

Für jeden, der das nachvollziehen will, habe ich die unveränderte Datei hier mal angehängt.
Also nicht für den Einsatz, nur zum guggen und mitmachen!!
Deswegen habe ich den Thread jetzt auch in die Coder und Bastlerecke verschoben
