Seite 1 von 1
text richtig parsen
Verfasst: 24.07.2011 22:52
von Nobody-66
ich habe eine seite geschrieben, wo die user text eingeben können, welcher dann in die DB gespeichert werden soll. nun soll der ja aber sicher in die datenbank gelangen ohne das böse menschen das script "austricksen" können. bei beiträgen und PN wird das ja alles gecheckt. meine frage nun: was muss ich in mein scriptteil einfügen, damit das auch alles so sicher wird wie bei beiträgen und PN ist?
schonmal ein großes danke im vorraus für eure hilfe
Re: text richtig parsen
Verfasst: 24.07.2011 23:45
von BNa
Re: text richtig parsen
Verfasst: 25.07.2011 19:25
von Nobody-66
reicht echt schon das sql_escape? den in der posting.php sind doch noch eine ganze menge mehr prüfungen, oder täusche ich mich da und die sind für was anderes?
ich habe als vorlage diesen teil vom MOD Simple Profile Comments (1.6.1) genommen gehabt:
Code: Alles auswählen
// check if the comment is blank, if so trigger a error.
if(!request_var('comment_text','', true))
{
trigger_error($user->lang['BLANK_COMMENT']);
}
$time = time();
$comment_id = request_var('comment_id', 0);
$comment_poster_id = $user->data['user_id'];
$comment_author = $user->data['username'];;
$comment_text = request_var('comment_text','', true);
$comment_to_id = request_var('comment_to_id', 0);
$uid = $bitfield = $options = '';
$allow_bbcode = $allow_urls = $allow_smilies = true;
generate_text_for_storage($comment_text, $uid, $bitfield, $options, $allow_bbcode, $allow_urls, $allow_smilies);
$sql_ary = (array(
'comment_date' => $time,
'comment_id' => $comment_id,
'comment_poster_id' => $comment_poster_id,
'comment_to_id' => $comment_to_id,
'comment_author' => $comment_author,
'comment_text' => $comment_text,
'bbcode_uid' => $uid,
'bbcode_bitfield' => $bitfield,
'bbcode_options' => $options,
));
$sql = 'INSERT INTO ' . COMMENT_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql);
das ganze erscheint mir aber überhaupt nicht sicher. und was in der posting. php vom forum steht ist ja eine ganze menge mehr...
auch hätte ich gerne, das die maximale zeichenanzahl überprüft wird und wenn es zu viele sind, eine fehlermeldung gibt (so wie bei den foren-beiträgen). die fehlermeldung bekomme ich selbst hin, nur weiss ich nicht, wie man es prüft
Re: text richtig parsen
Verfasst: 02.08.2011 18:17
von Nobody-66
mal ein kleiner push....
Nobody-66 hat geschrieben:...
auch hätte ich gerne, das die maximale zeichenanzahl überprüft wird und wenn es zu viele sind, eine fehlermeldung gibt (so wie bei den foren-beiträgen). die fehlermeldung bekomme ich selbst hin, nur weiss ich nicht, wie man es prüft
Re: text richtig parsen
Verfasst: 03.08.2011 10:44
von D@ve
reicht echt schon das sql_escape?
Nein, Du solltest Du noch htmlentities drüberlaufen lassen um XSS zu vermeiden.
Code: Alles auswählen
$string = $db->sql_escape(htmlentities($string)
$db->sql_query('INSERT INTO' . BLA_TABLE . "bt SET bt.blubb = '$string'");
Re: text richtig parsen
Verfasst: 03.08.2011 17:04
von Pyramide
D@ve hat geschrieben:Du solltest Du noch htmlentities drüberlaufen lassen
Das erledigt die Funktion request_var bereits.
Re: text richtig parsen
Verfasst: 23.08.2011 21:31
von Nobody-66
mal noch ein problem zu dem thema:
hier
http://phpbb3.pytalhost.com/viewtopic.php?f=23&t=241 wird die SQL Injection angesprochen.
wenn ich nun
0 UNION SELECT user_email as username FROM phpbb_users WHERE user_id = 2
in mein textfeld eingebe und es ans script schicke, macht er meiner meinung nach nicht das, was er solte.
hier erstmal mein code:
Code: Alles auswählen
$username_replace = str_replace('*', $db->any_char, utf8_clean_string($username));
# wenn bei der suche ein jocker verwendet wird, soll er ersetzt werden
$sql_where .= ($username_replace) ? 'username_clean LIKE ' . $db->sql_escape($username_replace) : '';
$sql = "SELECT *
FROM " . USERS_TABLE . "
WHERE $sql_where";
$result = $db->sql_query($sql);
wenn ich mir jetzt die abfrage "anzeigen" lasse, kommt:
SELECT * FROM phpbb_users WHERE username_clean LIKE 0 union select user_email as username from phpbb_users where user_id = 2
müsste nicht eigentlich sowas wie '0 UNION SELECT user\_email as username FROM phpbb\_users WHERE user\_id = 2' dort stehen? oder verstehe ich das wieder mal falsch?
habe leider von SQL Injection noch nicht so die ahnung, um das verlässlich zu testen, ob er es wirklich richtig "entschärft".
daher wäre ich für eure hilfe sehr dankbar
Re: text richtig parsen
Verfasst: 23.08.2011 22:12
von Pyramide
Da du in deinem SQL-Spruch keine einfachen Anführungszeichen ( ' ) drin hast, tauchen die logischerweise auch nicht im Endergebnis auf. Die Variante ohne Anführungszeichen (also "... WHERE user_id = 0 ...") darf aus genau diesem Grund nur bei Zahlen verwendet werden.
Re: text richtig parsen
Verfasst: 24.08.2011 18:59
von Nobody-66
Pyramide hat geschrieben:Da du in deinem SQL-Spruch keine einfachen Anführungszeichen ( ' ) drin hast, tauchen die logischerweise auch nicht im Endergebnis auf. Die Variante ohne Anführungszeichen (also "... WHERE user_id = 0 ...") darf aus genau diesem Grund nur bei Zahlen verwendet werden.
verstehe leider nicht, was du meinst

Re: text richtig parsen
Verfasst: 24.08.2011 22:30
von D@ve
verstehe leider nicht, was du meinst
Ich auch nicht wirklich...

.
SQL-Injection komplett zu verhindern ist nicht ganz einfach. Ich bin bei mir gerade überlegen, ob ich meine Script auf prepared Statements umstelle. Das ist imo die einzig wirklich sichere Methode mit der man das ganz ausschließen kann.