Newseintrag schreiben



  • äh, ... SQL Injection ⚠



  • $sql = "INSERT INTO `goba_news` (`news_text`, `news_date`, `news_by`, `news_head`)
     VALUES ('".addslashes($_POST['text'])."', '".addslashes($_POST['date'])."', '".addslashes($_SESSION['acc_name'])."', '".addslashes($_POST['head'])."')";
    $bla = mysql_query($sql);
    

    Wenn $_SESSION['acc_name'] eine Zahl ist anstelle addslashes(), intval() nehmen.

    Die news_id dürfte normal vom SQL-Afruf selbst erstellt werden, das Feld sollte auf "autonincrement" stehen.



  • Also die ganzen Backsticks und so kommen daher, dass ich bei PHPMyAdmin einfach einen Eintrag hinzugefügt hab, mir den dafür angezeigten Code in meinen Kopiert und die jeweiligen Werte für die Variablen ersetzt.



  • Lass die Backticks lieber weg ... Die sind wartungs (und besonders migrations)-technisch eine Katastrophe, und zudem bei sinnvollen Tabellennamen überflüssig 😉



  • Ich weiß, dass das nur mit sehr viel Phantasie Ontopic ist, aber kanntet Ihr das hier schon? 🙂
    http://xkcd.org/327/



  • der ist absolut ontopic 🙂

    best of 🙂



  • Wo wir grad schon beim Thema sind, wie kann ich so was verhindern?^^

    http://www.c-plusplus.net/forum/viewtopic-var-p-is-1411085.html#1411085

    (Neuer Thread weil sonst ein Mod kommt und mir die Faustregel predigt ;))



  • Der neue Code:

    if (!isset($_POST['submit']))
    {
    ?>
    
    <form name="newsadd"  action="adindex.php?adnavid=adnewsadd" method=POST>
    <table border="0">
    	<tr>
    		<td>&Uuml;berschrift:</td>
    		<td><input type="text" name="head"></td>
    	</tr>
    	<tr>
    		<td>Datum:</td>
    		<td><input type="text" name="date"></td>
    	</tr>
    	<tr>
    		<td>Text:</td>
    		<td>
    			<textarea name="text" rows="3" cols="30"></textarea>
    		</td>
    	</tr>
    	<tr>
    		<td colspan="2"><center>
    			<input type="submit" name="submit" value="Newseintrag hinzuf&uuml;gen">
    		</center></td>
    	</tr>
    </table>
    
    <?php
    }
    else
    {
    
    $sql = "INSERT INTO `goba_news` (`news_text`, `news_date`, `news_by`, `news_head`)
     VALUES ('".addslashes($_POST['text'])."', '".addslashes($_POST['date'])."', '".addslashes($_SESSION['acc_name'])."', '".addslashes($_POST['head'])."')";
    $bla = mysql_query($sql);
    
    echo ("Newseintrag hinzugef&uuml;gt! oder auch nicht...");
    ?>
    <br><br>
    <a href="index.php?navid=news">Ansehen</a>
    
    <?php
    }
    

    Funktioniert immer noch nicht...



  • Nimm die ganzen Backticks mal weg und lass Dir den SQL-Error anzeigen (siehe oben).



  • Und auch wenn es mit dem nicht-funktionieren nichts zu tun hat, würde im im Zusammenhang mit MySQL eher mysql_real_escape_string() an Stelle von addslashes() verwenden.

    Gruß Jens



  • $sql = "INSERT INTO `goba_news` (`news_text`, `news_date`, `news_by`, `news_head`)
     VALUES ('".addslashes($_POST['text'])."', '".addslashes($_POST['date'])."', '".addslashes($_SESSION['acc_name'])."', '".addslashes($_POST['head'])."')";
    $bla = mysql_query($sql);
    

    Seit ihr alle Tippfaul? Bei sowas muesste der Php-Interpreter die Festplatte formatieren, die Grafikkarte und die CPU verbrennen lassen. Kurz den gesammten PC einschmelzen auf das du nie mehr Schaden anrichten kannst.

    $text = mysql_real_escape_string($_POST['text']);
    $date = mysql_real_escape_string($_POST['date']);
    // usw.
    $sql = "insert into goba_news (news_text, news_data, ....) values ('$text', '$date', ...)";
    $bla = mysql_query($sql);
    

    Wenn $_SESSION['acc_name'] eine Zahl ist anstelle addslashes(), intval() nehmen.

    Ich nehme dafuer sprintf(), vielleicht ein wenig overkill, aber egal:

    $sql = sprintf("
    insert table_name set a='%s', b=%d, c=%u;",
    $ein_str, $ein_int, $noch_ein_int);
    

Anmelden zum Antworten