• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

fragen zu mysql injections

xXxPeterPanxXx

Neues Mitglied
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();
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
 
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>";
        }
               
        }
        
        ?>
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
 
Zuletzt bearbeitet:
Der Fehler...

Code:
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);
}
 
$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();
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");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">


<head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title><?php echo $title; ?> | little-coder.de</title>
        <link rel="stylesheet" type="text/css" href="css/styles.css" />
        <meta name="robots" content="index,follow" />
        <meta name="description" content="Gepflegte Webseite mit vielen Tutorials speziell für Anfänger" />
        <meta name="keywords" content="php, html, css, tutorials" />


</head>

<body>


<h1>
    <form action="suche.php" method="POST">
    <fieldset>
      <input class="search" type="text" name="key" /><input class="but" type="submit" value="Suchen" />
      <a href="erweitertesuche.php" class="header">Erweiterte Suche</a>
      </fieldset>
      </form>
      <a href="index.php" class="link"><img src="http://www.html.de/images/header.png" width="400px" height="100px" alt="little-coder.de" class="picture" /></a>
</h1>
    
<div id="wrapper">
      <ul class="navi">
      
        <?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>

<div id="content">
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 "<h2>$title</h2>";
//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.<br /><strong>Viel Spass wünscht little-coder.de.</strong></p><hr />";
      echo "<h3>Suche</h3>";
      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\"/></fieldset></form>";
      echo "<h3>HTML-Tutorials</h3>";
      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']."</a></li>";
            }
      echo "</ul>";
}

//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.<br /><strong>Viel Spass wünscht little-coder.de.</strong></p><hr />";
    echo "<h3>Suche</h3>";
    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\"/></fieldset></form>";
    echo "<h3>PHP-Tutorials</h3>";
    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']."</a></li>";
          }
    echo "</ul>";
}
//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.<br /><strong>Viel Spass wünscht little-coder.de.</strong></p><hr />";
    echo "<h3>Suche</h3>";
    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\"/></fieldset></form>";
    echo "<h3>CSS-Tutorials</h3>";
    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']."</a></li>";
        }
    echo "</ul>";
}
//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><p class=\"year\">".$year = date("Y", $news['time'])."</p></div><h4>".$news['name']."</h4><p class=\"news_text\">".$news['news']."</p></div>";
}
$db->close();
}

//footer
include("footer.php");

?>
Ich sitzte nun schon seit mehreren Stunden an diesem Fehler:cry:.

MfG xXxPeterPanxXx
 
Zuletzt bearbeitet:
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
/**
* 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:
# 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;  
 }

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
 
Zurück
Oben