fragen zu mysql injections

Hi @all,
ich hoffe ich habe es hier richtig gepostet. Ich habe vor mich vor mysql injections zu schützen. Ich habe aber ein paar Fragen.

Bei wikipedia geraten, dass man PHP Data Objects verwenden soll. Hier im Forum hab ich immer nur von der Funktion mysql_real_escape_string gehört. Also was soll ich verwenden?

Ich belasse es erst einmal bei der Frage vllt. finde ich den Rest ja doch noch raus.

MfG xXxPeterPanxXx

Ich verwende die Prepare(glaub erst ab PHPv5) Variante. Beispiel mysqli:
[PHP]$befehl = "
INSERT INTO tabelle
(name, irgendwas)
VALUES
(?,?)";
$eintragen = $db->prepare($befehl);
$eintragen->bind_param(‚ss‘, $_POST[‚name‘], $_POST[‚irgendwas‘]);
$eintragen->execute();[/PHP]Hier erfolgt die Maskrierung und Quotierung(darum keine Hochkommas bei „?“) vom Treiber aus, so das auf diesem Wege keine SQL Injektion stattfinden kann.

Mfg

Danke ich versuche grade einen Code für eine Abfrage zusammen zu basteln, aber ich weiß nicht was in der $db Variable. Welche Datenbank-Daten stehen da drinne. Könntest du mir ein Beispiel geben?

MfG xXxPeterPanxXx

Könntest du mir ein Beispiel geben?

In mysqli sieht das so aus:
[PHP]$db = @new mysqli($db_host, $db_usr, $db_pw, $db_name);[/PHP]
Ob es mit der „normalen“ mysql Funktion auch so geht, weis ich leider nicht.

Mfg

Ist mysql_real_escape_string sicher? Weil mit der prepare Technik schaffe ich das nicht.

MfG xXxPeterPanxXx

Korrekt eingesetzt ja. Es ist eben Teil der alten mysql_*-Funktionen.

So ich bin schon weiter, denn Die Zahl wahr so nett und hat mir geholfen. Ich bin grad dabei von mysql auf mysqli umzustellen. Teilweise hats auch schon geklappt, aber wenn ich z.B im Html Bereich (auf der website) geh werden die Kategorien nicht erfolgreich aus der Datenbank gelesen.

Das hier ist der Script für die Navi:
[php]
<?php
$kategorien = „SELECT * FROM kategorien“;
$ergebnis = $db->query( $kategorien );
while ($kategorie = $ergebnis->fetch_array())

    {
    if ($name == "HTML" && $kategorie['name'] == "HTML") {
    echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=html\" class=\"active\">HTML</a></li>";
    } 
    elseif ($name == "CSS" && $kategorie['name'] == "CSS") {
    echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=css\" class=\"active\">CSS</a></li>";
    }
    elseif ($name == "PHP" && $kategorie['name'] == "PHP") {
    echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=php\" class=\"active\">PHP</a></li>";
    }
    elseif ($name == "News" && $kategorie['name'] == "News") {
    echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=news\" class=\"active\">News</a></li>";
    }
    else {
    echo "<li class=\"navi\"><a href=\"kategorie.php?name=".$kategorie['name_url']."\">".$kategorie['name']."</a></li>";
    }
           
    }
    
    ?>

[/php]und hier der Link zur Seite:
Benutzername: gast
Passwort: Gastgast19
http://little-coder.de/kategorie.php?name=html

Seht ihr denn Fehler?

Danke im Vorraus!

MfG xXxPeterPanxXx

Danke

Der Fehler…

Fatal error: Call to a member function fetch_array() on a non-object in header.php on line 53

…besagt, dass $db->query() kein passendes MySQLi_Result-Objekt zurückgibt. Da die Query selbst wohl richtig ist (so komplex ist sie ja nicht), würde ich tippen, dass $db falsch initialisiert wurde (DB nicht ausgewählt?).

Zum Debuggen könntest du mal das hier versuchen:

[php]if (!$db->query($kategorien)) {
printf(„Errormessage: %s\n“, $db->error);
}[/php]

$db ist 100% richtig, da ich die Variable wo anders schon erfolgreich nutze.

Es könnte auch an der Datei kategorie.php liegen. Dort steht dieser Script der mit der header.php zusammenhängt:
[php]
$kategorien = „SELECT * FROM kategorien WHERE name_url =?“;
$prepare = $db->prepare($kategorien);
$prepare->bind_param(‚s‘, $_GET[‚name‘]);
$prepare->execute();
$prepare->bind_result($id,$name,$name_url);
$prepare->fetch();
[/php]
In den Variablen $id, $name und $name_url steht etwas drin.

MfG xXxPeterPanxXx

Sorry für Doppelpost.

So ich habe mittels num_rows die Ausgaben gezählt und festgestellt, dass auf der Startseite alle vier Kategorien gezählt wurde gehe ich jedoch auf eine Kategorie zählt num_rows nichts mehr und gibt nur die Fehermeldung aus.

Ich poste nun noch einmal den ganzen Code:
header.php:

[code]

<?php require_once("config.inc.php"); ?> <?php echo $title; ?> | little-coder.de

Erweiterte Suche little-coder.de

        <?php
        if ($url == "peter") {
        echo "<li class=\"active\"><a href=\"index.php\" class=\"active\">Home</a></li>";
        } else {
        echo "<li class=\"navi\"><a href=\"index.php\">Home</a></li>";
        }
        ?>
        
        
        
        
        
        
     
        <?php
        $kategorienew = "SELECT * FROM `kategorien`";
        $ergebnis = $db->query( $kategorienew );
        echo $ergebnis->num_rows;
        while ($kategoriex = $ergebnis->fetch_array())
        
            
                     
        
        
        {
        if ($name == "HTML" && $kategoriex['name'] == "HTML") {
        echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=html\" class=\"active\">HTML</a></li>";
        } 
        elseif ($name == "CSS" && $kategoriex['name'] == "CSS") {
        echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=css\" class=\"active\">CSS</a></li>";
        }
        elseif ($name == "PHP" && $kategoriex['name'] == "PHP") {
        echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=php\" class=\"active\">PHP</a></li>";
        }
        elseif ($name == "News" && $kategoriex['name'] == "News") {
        echo "<li class=\"active\"><a href=\"http://little-coder.de/kategorie.php?name=news\" class=\"active\">News</a></li>";
        }
        else {
        echo "<li class=\"navi\"><a href=\"kategorie.php?name=".$kategoriex['name_url']."\">".$kategoriex['name']."</a></li>";
        }
               
        }
        
        ?>
        
        
        
      </ul>
    
    [/code]und kategorie.php [code] <?php require_once("config.inc.php");

    $kategorien = „SELECT * FROM kategorien WHERE name_url =?“;
    $prepare = $db->prepare($kategorien);
    $prepare->bind_param(‚s‘, $_GET[‚name‘]);
    $prepare->execute();
    $prepare->bind_result($id,$name,$name_url);
    $prepare->fetch();

    $title = $name;
    
        include("header.php");
    

    echo „

    $title

    “;
    //html
    if ($name_url == „html“) {
    echo „<p class="tut">Sie befinden sich nun im HTML-Tutorialbereich. Sie können nun ein Tutorial auswählen oder suchen.
    Viel Spass wünscht little-coder.de.


    “;
    echo „

    Suche

    “;
    echo „<form action="suche.php" method="post"><fieldset class="suche"><input type="text" name="key" class="suche" /><input type="hidden" value="1" name="cat" /><input type="submit" name="html" value="Suchen" class="button"/>“;
    echo „

    HTML-Tutorials

    “;
    echo „<ul class="kategorie">“;
    $html_tuts = „SELECT * FROM eintraege WHERE kategorie = 1 ORDER BY name ASC“;
    $ergebnis = $db->query( $html_tuts );
    while ($html_tut = $ergebnis->fetch_array()) {
    echo „<li class="kategorie"><a href="tutorial.php?nameurl=“.$html_tut[‚nameurl‘].„" class="kategorie">“.$html_tut[‚name‘].„“;
    }
    echo „
“;
}

//php
if ($name_url == „php“) {
echo „<p class="tut">Sie befinden sich nun im PHP-Tutorialbereich. Sie können nun ein Tutorial auswählen oder suchen.
Viel Spass wünscht little-coder.de.


“;
echo „

Suche

“;
echo „<form action="suche.php" method="post"><fieldset class="suche"><input type="text" name="key" class="suche" /><input type="hidden" value="4" name="cat" /><input type="submit" name="html" value="Suchen" class="button"/>“;
echo „

PHP-Tutorials

“;
echo „<ul class="kategorie">“;
$php_tuts = mysql_query(„SELECT * FROM eintraege WHERE kategorie = 4 ORDER BY name ASC“);
$ergebnis = $db->query( $php_tuts );
while ($php_tut = $ergebnis->fetch_array()) {
echo „<li class="kategorie"><a href="tutorial.php?nameurl=“.$php_tut[‚nameurl‘].„" class="kategorie">“.$php_tut[‚name‘].„“;
}
echo „“;
}
//css
if ($name_url == „css“) {
echo „<p class="tut">Sie befinden sich nun im CSS-Tutorialbereich. Sie können nun ein Tutorial auswählen oder suchen.
Viel Spass wünscht little-coder.de.


“;
echo „

Suche

“;
echo „<form action="suche.php" method="post"><fieldset class="suche"><input type="text" name="key" class="suche" /><input type="hidden" value="3" name="cat" /><input type="submit" name="html" value="Suchen" class="button"/>“;
echo „

CSS-Tutorials

“;
echo „<ul class="kategorie">“;
$css_tuts = „SELECT * FROM eintraege WHERE kategorie = 3 ORDER BY name ASC“;
$ergebnis = $db->query( $css_tuts );
while ($css_tut = $ergebnis->fetch_array()) {
echo „<li class="kategorie"><a href="tutorial.php?nameurl=“.$css_tut[‚nameurl‘].„" class="kategorie">“.$css_tut[‚name‘].„“;
}
echo „“;
}
//news
if ($name_url == „news“) {
$newss = „SELECT * FROM news ORDER BY time DESC“;
$ergebnis = $db->query( $newss );

while ($news = $ergebnis->fetch_array()) {

echo „<div class="news"><div class="date"><p class="day_month">“.$day = date(„j“, $news[‚time‘]).„. „.$month = date(„F“, $news[‚time‘]).“

<p class="year">“.$year = date(„Y“, $news[‚time‘]).„

“.$news[‚name‘].„

<p class="news_text">“.$news[‚news‘].„

“;
}
$db->close();
}

//footer
include(„footer.php“);

?>
[/code]Ich sitzte nun schon seit mehreren Stunden an diesem Fehler:cry:.

MfG xXxPeterPanxXx

Der Fehler lag daran: Commands out of sync; you can’t run this command now…2014

Du hast vorher schon ein Prepare offen. Bevor du ein weiteren Prepare machen kannst, musst du das alte erst schliessen: $stmt->close();

Mfg

Bei wikipedia geraten, dass man PHP Data Objects verwenden soll. Hier im Forum hab ich immer nur von der Funktion mysql_real_escape_string gehört. Also was soll ich verwenden?

Du kannst ruhig PHP Data Objects (PDO) verwenden. Hat den Vorteil gegen über mysqli das es Permamente Verbindungen aufbauen kann.

Ein Tutorial zur verwendung findest unter:
Einführung in PDO - Wiki - Coder Forum

Beispiel anwendungen:
[PHP]
// Datenbank Verbindungsdaten
$serv = ‚localhost‘ ; // Server
$uid = ‚‘ ; // Benutzer
$pw = ‚‘ ; // Password
$dbname = ‚dbname‘; // Datenbankname
$prefix=‚‘; // Tabellen voranstellung
define(„dbname“, $dbname);
define(„dbServ“, $serv);
define(„dbuid“, $uid);
define(„dbPw“, $pw);
define(„prefix“, $prefix);
[/PHP]
[PHP]

<?php /** * Datenbank Klasse * @version 1.1 * @author Splasch * Filename: dbpdo.php * Verbindung über die PDO herstellen **/ class Dbpdo { private $uid=dbuid; #Benutzename private $pw=dbPw; #Password private $serv=dbServ; #Datenbank Server private $dbname=dbname; #Datenbank Name protected static $db_obj = null; #Datenbank Objekt PDO public $error; #Fehler Varibale /** * Klassen aufruf PDO verbindung aufbauen * */ public function __construct() { $db="mysql:dbname=".$this->dbname.";host=".$this->serv; #mysql:dbname=Datenbankname;host=localhost try { self::$db_obj = new PDO($db, $this->uid, $this->pw,array ( PDO::ATTR_PERSISTENT => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING #PDO::ERRMODE_EXCEPTION #PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true ) ); } catch (PDOException $e) { $this->error='Fehler beim Öffnen der Datenbank: ' . $e->getMessage(); echo $this->error; #Fehler ausgabe } } /** * Eine Instanz des PDO Objektes übergeben * @return Objekt $db_obj */ public static function get_db() { if(is_null(self::$db_obj)) { self::$db_obj = new Dbpdo(); } return self::$db_obj; } } // Ende Klasse ?>

[/PHP]

[PHP]

Klasse includen oder den Autoloader verwenden

Datenbank Objekt erstellen

$db = new Dbpdo;
$obj= $db->get_db();

$check=„SELECT
land_frei,f_userid,land_id,f_basisid
FROM
land,user_land
WHERE
land_id = f_landid AND
ycord=:y AND xcord=:x Limit 1“;
$stmt = $obj->prepare($check);
$stmt->bindParam(‚:y‘,$y,PDO::PARAM_INT);
$stmt->bindParam(‚:x‘,$x,PDO::PARAM_INT);
$stmt->execute();
if(is_object($data = $stmt->fetch(PDO::FETCH_OBJ)))
{
$land[‚land_frei‘]=$data->land_frei;
$land[‚land_id‘]=$data->land_id;
$land[‚user_id‘]=$data->f_userid;
$land[‚basis_id‘]=$data->f_basisid;
}
[/PHP]

Weitere Anwendungs Beispiele findest unter:
php-resource.de das PHP Handbuch - Hilfe zu den PHP Befehlen ref.pdo
PHP Tutorials Examples Introduction to PHP PDO

Mfg Splasch