+ Antworten
Ergebnis 1 bis 9 von 9

Thema: Sicherheitsfragen in eigenem Code

  1. #1
    War schon öfter hier
    Registriert seit
    23.05.2007
    Ort
    Berlin
    Beiträge
    224
    Bedankte sich
    39
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard Sicherheitsfragen in eigenem Code

    Hallo liebe Joomlagemeinde
    Ich habe mir vor kurzen nen kleines Gästebuch geschrieben weil ich die bisherigen irgendwie als etwas überladen empfand.... Da ich auch sonst meine Scripte in diesem Schreibstil schreibe und mir noch nicht so viele Gedanken über mögliche SicherheitsRisiken gemacht habe, wollt ich einfach mal Fragen ob der Code so okay wär.

    Bin da noch nich lange dabei, hoffe aber noch viel zu lernen

    Code is verkürzt.... überfliegen reicht aus
    PHP-Code:
    <?php
    // TOBI Guestbook Extension
    defined('_JEXEC') or die('Restricted access'); 
    require_once (
    JPATH_COMPONENT.DS.'controller.php'); 
    $controller = new lostrommelController();
    $controller->executetrue ); 
    $controller->redirect(); 

    $language = &JFactory::getLanguage(); 
    $language->load('com_jwallet'JPATH_BASE .DS.'components'.DS.'com_jwallet'); 

    $task JRequest::getVar('extension');
    $profileid JRequest::getVar('profileid');

    switch (
    $task){

    case 
    "showuserguestbook":
        
    show_user_guestbook($option);
        break;
    case 
    "showmyguestbook":
        
    show_my_guestbook($option);
        break;    
    case 
    "composeguestbookentry";
        
    compose_guestbook_entry($option);
        break;    
    default:
        
    compose_guestbook_entry($option);    
    }

    function 
    show_user_guestbook() {
     
    $user = & JFactory::getUser();
     
    $userid $user->get('id');
     
    $username $user->get('username');
     
    $profileid JRequest::getVar('profileid');

      
    $db = &JFactory::getDbo();
      
    $query "SELECT username FROM #__users WHERE id = '".$profileid."'";
      
    $db->setQuery($query); 
      
    $profilename $db->loadResult();
      echo 
    $profilename."'s Guestbook";

    if (
    $userid!=$profileid){
        echo 
    '<br><a href="index.php?option=com_jwallet&todo=guestbook&extension=composeguestbookentry&profileid='.$profileid;
        echo 
    '">Beitrag schreiben</a>';
    }
         echo 
    '<link rel="stylesheet" type="text/css" href="components/com_jwallet/views/jwallet/tmpl/table.css">';

    $query "SELECT * FROM #__jwallet_guestbook Where recieverid = '".$profileid."' ORDER BY date DESC";
    $db->setQuery($query); 
    if ( !
    $db->query() ) { 
      echo 
    "<script type='text/javascript'> 
                alert('"
    .$db->getErrorMsg()."'); 
                </script>"

           return 
    false
       } else { 
    $rows $db->loadObjectList();

     
     echo 
    '<div class="tbody">';
     echo 
    '</div><br>';
     echo 
    '<table >';
     echo 
    '<div class="tbody">';
     echo 
    '<td>Von</td><td>Bild</td><td>Headline</td><td>Text</td><td>Datum</td>';

       foreach( 
    $rows as $row ) {  
       
    $headline $row->headline;
       
    $text $row->text;
       
    $senderid $row->senderid;
       
    $date $row->date;

      
    $query "SELECT thumb FROM #__community_users WHERE userid = '".$senderid."'";
      
    $db->setQuery($query); 
      
    $thumb $db->loadResult();

      
    $query "SELECT username FROM #__users WHERE id = '".$senderid."'";
      
    $db->setQuery($query); 
      
    $sendername $db->loadResult();

        
    $datum date("d.m.Y",$date);
        
    $uhrzeit date("H:i",$date);
      
       
    $text=str_replace(":DD",'<img src="components/com_jwallet/smileys/grin.png" border=0 height=30 width=30>',$text);

     echo 
    '<tr>';
     echo 
    '<td>';
     echo 
    '<a href = "index.php?&option=com_community&view=profile&userid='.$senderid.'">'.$sendername.'</a>';
     echo 
    '<td/>';
     echo 
    '<a href = "index.php?&option=com_community&view=profile&userid='.$senderid.'"><img src="'.$thumb.'" width="60" height="60" alt="BILD"></a>';
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    $headline;
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    '<div class="ssmed">';
     echo 
    $text;
     echo 
    '</div>';
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    $datum.'<br>'.$uhrzeit.' Uhr';
     echo 
    '</td>';
     echo 
    '</div>';        
     echo 
    '</tr>';
      } 
     echo 
    '</div>';                
     echo 
    '</table>';        
    }

    function 
    show_my_guestbook() {
      
    $user = & JFactory::getUser();
      
    $userid $user->get('id');
      
    $username $user->get('username');
      
    $profileid JRequest::getVar('profileid');
      
    $read JRequest::getVar('read');
      
    $db = &JFactory::getDbo();
      
    $message JRequest::getVar('message');

     if(
    $message=="1") {
     echo 
    JText::_'JWALLETENTRYDELETESUCCESS' ).'<br>';
    } else if(
    $message=="2") {
     echo 
    JText::_'JWALLETENTRYDELETEFAILED' ).'<br>';
    }

    if (
    $read=1) {
      
    $query "UPDATE #__jwallet_guestbook SET unread = 0 WHERE recieverid='".$userid."'";
        
    $db->setQuery($query); 
        
    $result $db->query();
        if (
    mysql_errno()) die ("MySQL-Error: " mysql_error());
        }
     
      echo 
    $username."'s Guestbook";
      echo 
    '<link rel="stylesheet" type="text/css" href="components/com_jwallet/views/jwallet/tmpl/table.css">';

    $query "SELECT * FROM #__jwallet_guestbook Where recieverid = '".$userid."' ORDER BY date DESC";
    $db->setQuery($query); 
    if ( !
    $db->query() ) { 
         echo 
    "<script type='text/javascript'> 
                alert('"
    .$db->getErrorMsg()."'); 
                </script>"

           return 
    false
       } else { 
     
    $rows $db->loadObjectList();
     } 
        if (empty(
    $rows)) {
         echo 
    '<br><br><div align="center"><img src="http://www.joomlaportal.de/images/totehose.jpg" align="center" alt="Keine Eintr&auml;ge" width="230" height="250"></div>';
    } else {
     echo 
    '<div class="tbody">';
     echo 
    '</div><br>';
     echo 
    '<table >';
     echo 
    '<div class="tbody">';
     echo 
    '<td>Von</td><td>Bild</td><td>Headline</td><td>Text</td><td>Datum</td><td>l&ouml;schen</td>';
       
       foreach( 
    $rows as $row ) {  
       
    $headline $row->headline;
       
    $text $row->text;
       
    $senderid $row->senderid;
       
    $date $row->date;
       
    $id $row->id;

      
    $query "SELECT thumb FROM #__community_users WHERE userid = '".$senderid."'";
      
    $db->setQuery($query); 
      
    $thumb $db->loadResult();

      
    $query "SELECT username FROM #__users WHERE id = '".$senderid."'";
      
    $db->setQuery($query); 
      
    $sendername $db->loadResult();

      
    $datum date("d.m.Y",$date);
      
    $uhrzeit date("H:i",$date);
      
    $eraseentrylink='<a href="index.php?option=com_jwallet&todo=eraseentry&site=guestbook&id='.$id.'"><img src="http://www.joomlaportal.de/images/cancel_f2.png" alt="l&ouml;schen" width="15" height="15"></a>';
      
       
    $text=str_replace(":DD",'<img src="components/com_jwallet/smileys/grin.png" border=0 height=30 width=30>',$text);
     
     echo 
    '<tr>';
     echo 
    '<td>';
     echo 
    '<a href = "index.php?&option=com_community&view=profile&userid='.$senderid.'">'.$sendername.'</a>';
     echo 
    '<td/>';
     echo 
    '<a href = "index.php?&option=com_community&view=profile&userid='.$senderid.'"><img src="'.$thumb.'" width="60" height="60" alt="BILD"></a>';
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    $headline;
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    '<div class="ssmed">';
     echo 
    $text;
     echo 
    '</div>';
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    $datum.'<br>'.$uhrzeit.' Uhr';
     echo 
    '</td>';
     echo 
    '<td>';
     echo 
    $eraseentrylink;
     echo 
    '</td>';
     echo 
    '</div>';        
     echo 
    '</tr>';

     echo 
    '</div>';                
     echo 
    '</table>';
        
    }}

    function 
    compose_guestbook_entry() {
     
    $user = & JFactory::getUser();
     
    $userid $user->get('id');
     
    $username $user->get('username');
     
    $profileid JRequest::getVar('profileid');
     
    $submit JRequest::getVar('submit');
     
    $timestamp time();
      
      
    $db = &JFactory::getDbo();
      
    $query "SELECT username FROM #__users WHERE id = '".$profileid."'";
      
    $db->setQuery($query); 
      
    $profilename $db->loadResult();

    if (isset(
    $submit)){
      
    $headline JRequest::getVar('headline');
      
    $textbox JRequest::getVar('textbox');
      
    $link '<a href="index.php?option=com_community&view=profile&userid='.$profileid.'">'.JTEXT::_('GUESTBOOKREDIRECT4').'</a><br><br>';

    if (
    $userid!=$profileid) {

    $query "INSERT INTO #__jwallet_guestbook" "\n ( `senderid`,`recieverid`,`date`,`headline`,`text` )" "\n VALUES" "\n ( '$userid','$profileid','$timestamp','$headline','$textbox');";
        
    $db->setQuery($query); 
        
    $result $db->query();
        if (
    mysql_errno()) die ("MySQL-Error: " mysql_error());
      echo 
    JTEXT::_('GUESTBOOKCOMPOSEFINISH1').' '.$profilename.' '.JTEXT::_('GUESTBOOKCOMPOSEFINISH2').'<br>';
        echo 
    '<br><br>';
        echo 
    '<img src="http://www.joomlaportal.de/images/checkmark.jpg" align="right" "alt="" width="80" height="90" border="2">';
        echo 
    '<meta **********=*********
      content="3; url=index.php?option=com_community&view=profile&userid='
    .$profileid.'">';
      echo 
    '<br><br>';
      echo 
    JTEXT::_('GUESTBOOKREDIRECT').$profilename.JTEXT::_('GUESTBOOKREDIRECT2').'<br><br>'.JTEXT::_('GUESTBOOKREDIRECT3').$link;
      echo 
    '<br>';
    } else {
      echo 
    JTEXT::_('GUESTBOOKMISTAKE');
    }} else {
      echo 
    $profilename.' '.JTEXT::_('GUESTBOOKCOMPOSE').'<br>';
    ?>

    <script languag="JavaScript">
          function addsmiley(smiley)
            {
              document.guestbook.textbox.value=document.guestbook.textbox.value+' '+smiley;
              document.guestbook.textbox.focus();
            }
        </script>
        <a href="javascript: addsmiley(':DD')"><img src="components/com_jwallet/smileys/grin.png" alt="" width="60" height="60" border="0"></a>

    <?php
    echo '<form id="guestbook" name="guestbook" action="index.php?option=com_jwallet&todo=guestbook&extension=composeguestbookentry&profileid='.$profileid.'" method="post"><br>';
    echo 
    'Headline: <br><textarea name="headline" cols="60" rows="1" value="'.$headline.'"></textarea><br>';
    echo 
    'Text:<br><textarea name="textbox" size="300" cols="60" rows="10" value="'.$text.'"></textarea><br>';
    echo 
    '<input type="submit" name="submit">';
    echo 
    '</form>';
    }}
    ?>
    Hab schon einiges über MySql Injection gelesen, mich jedoch darauf verlassen das das von Joomla verwendete JRequest::getVar() ausreicht.

    Auch würd ich gerne Wissen obs okay ist wenn man die Pfade in Klartext überall reinschreibt oder ob das egal ist ....

    hoffe ihr habt nen guten Rat, das ich mich auf den sicheren Weg befinde

    Gruß
    Tobi
    Gandii.de -> coming soon

  2. #2
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Das hat mit einem Model-Viel-Controller Konzept wenig zu tun.

    Jede Variable, die kein Integer ist, wird einfach per
    PHP-Code:
    ".$db->Quote($profileid)." 
    Weitere ' kannst du dir sparen.

    Sofern es kein String, sondern eine ID ist, empfiehlt es sich nicht nur die Var per
    PHP-Code:
    $xyz JRequest::getInt('profileid'); 
    zu holen, sondern die id auch in der Abfrage zu casten.
    PHP-Code:
    ".(int)$profileid." 
    Auch hier wären keine ' ' angebracht, dann es handelt sich im einen Interger und nicht um
    einen String.

    Dass du ganz nebenbei mal 40 Datenbankabfragen für eine action haben kannst, scheint
    dir nicht so wichtig zu sein. Man könnte jetzt sehr weit ausholen, aber das möchte
    ich an dieser Stelle nicht. Fünf Anregungen:
    • Du programmierst nicht gehen die Schnittstellen, sondern verwendet deinen eigenen Code.
      Beispiel: DB Error Management
    • Ausgaben sind nicht xhtml konform und werden nicht XSS gesichert.
      Beispielsweise per htmlspecialchars oder Joomla Outputfilter.
    • Ausgaben von HTML Strukturen per echo sind weniger anzuraten. Zudem folgt das Design
      nicht - wie oben bereits angemerkt - dem MVC Muster.
    • Daten werden nicht validiert - gleichzeitig gibt es keine Ausnahmen im Programmcode,
      wodurch es zu vielen Fehlern und Problemen kommen kann.
    • Du schreibst Variablen um und kopiert sie - völliger overload.
      Bsp. $date = $row->date; Warum?

    Hauptsache es läuft.

  3. Erhielt Danksagungen von:


  4. #3
    War schon öfter hier
    Registriert seit
    23.05.2007
    Ort
    Berlin
    Beiträge
    224
    Bedankte sich
    39
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard

    Super Danke Da gibts wohl noch einiges zu tun *G
    Da ist es ja doch erstaunlich das das Script überhaupt irgendwie läuft

    Den ersten Teil deiner Antwort verstehe ich und werd das in Zukunft übernehmen.
    Das man ' ' nur für strings benutzt hab ich echt nicht gwusst *schäm*
    Mit dem Casten und ".$db->Quote($profileid)." ist klar.

    Doch im nächsten Teil deiner Antwort kommen mir ein paar Fragen auf.
    1. Welche Funktionen fürs DB ErrorManagement und die Outputfilterung bietet Joomla denn an ?

    2. Wie html Code ausgeben wenn nicht mit echo ?

    3. $date = $row->date; Ich dachte immer das ich damit die Werte aus der Datenbank ziehe ? Was kopiere ich da ?

    Die Masse meiner Abfragen sind wirklich enorm, leider weiß ich auch nicht wie ich das vermeiden kann, wenn ich die Daten doch in jeder Funktion brauche ? Irgendwie übergeben ... aber wie ?

    Wär schön wenn du mir nochmal helfen kannst, oder gibts irgendwie nen Link wo man das Programmieren mit Joomla einfach erklärt bekommt oder eine Übersicht aller Joomla Funktionen?

    Lg
    tobi
    Gandii.de -> coming soon

  5. #4
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Das man ' ' nur für strings benutzt hab ich echt nicht gwusst *schäm*
    Ist in PHP auch egal. Du musst es für einen String benutzen, bzw. Quote macht welche, aber
    trotzdem kann man auch einen Integer quoten. Die Joomla Docs empfiehlt das sogar, weil
    alles das da durchgelaufen ist, eben sicher ist. Egal ob nun String oder Integer. Trotzdem
    bleibt in Integer gecasteter String auch save, sofern nicht irgendwo ein Bug in der PHP
    Engine ist.

    1. Welche Funktionen fürs DB ErrorManagement und die Outfilterung bietet Joomla denn an ?
    http://api.joomla.org/Joomla-Framewo...JDatabase.html

    JFilterOutput::objectHTMLSafe(), aber das folgt einer Vereinbarung, die du nicht
    einhältst. Alternativ einfach:
    PHP-Code:
    htmlspecialchars$varENT_QUOTES'UTF-8' ); 
    2. Wie html Code ausgeben wenn nicht mit echo ?
    PHP-Code:
    ... ?><a href="<?php echo $link?> title="<?php echo $title?>"><?php echo $name?></a><?php ...
    3. $date = $row->date; Ich dachte immer das ich damit die Werte aus der Datenbank ziehe ? Was kopiere ich da ?
    Du kopiert die Variable date des Objekts row in die Variale $date. Mit der Datenbank
    hat das gar nichts zu tun. $row->date ist eine Variable, wie jede andere auch, nur dass
    sie eine Variable ist, die dem Objekt $row zugeschrieben wird.

    Wär schön wenn du mir nochmal helfen kannst, oder gibts irgendwie nen Link wo man das Programmieren mit Joomla einfach erklärt bekommt oder eine Übersicht aller Joomla Funktionen?
    http://api.joomla.org/li_Joomla-Framework.html

  6. Erhielt Danksagungen von:


  7. #5
    War schon öfter hier
    Registriert seit
    23.05.2007
    Ort
    Berlin
    Beiträge
    224
    Bedankte sich
    39
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard

    Hab versucht deine Tipps umzusetzen, das Script funktioniert immernoch

    PHP-Code:
    <?php
    // TOBI Guestbook Extension
    defined('_JEXEC') or die('Restricted access'); 
    require_once (
    JPATH_COMPONENT.DS.'controller.php'); 
    $controller = new lostrommelController();
    $controller->executetrue ); 
    $controller->redirect(); 
    $language = &JFactory::getLanguage(); 
    $language->load('com_lostrommel'JPATH_BASE .DS.'components'.DS.'com_jwallet'); 
    $task JRequest::getVar('extension');
    $profileid JRequest::getVar('profileid');

    switch (
    $task){
    case 
    "showuserguestbook":
        
    show_user_guestbook($option);
        break;
    case 
    "showmyguestbook":
        
    show_my_guestbook($option);
        break;
    case 
    "composeguestbookentry";
        
    compose_guestbook_entry($option);
        break;
        default:
        
    compose_guestbook_entry($option);
    }

    function 
    show_user_guestbook() {
     
    $user = & JFactory::getUser();
     
    $userid $user->get('id');
     
    $username $user->get('username');
     
    $profileid JRequest::getInt('profileid');
     
    $db = &JFactory::getDbo();
     
     
    $query "SELECT username FROM #__users WHERE id = ".(int)$profileid."";
     
    $db->setQuery($query); 
     
    $profilename $db->loadResult();
     echo 
    $profilename."'s Guestbook";
     if (
    $userid!=$profileid){
     
    ?>
     
     <br><a href="index.php?option=com_lostrommel&todo=guestbook&extension=composeguestbookentry&profileid=
         <?php echo (int)$profileid?>">Beitrag schreiben</a>
        <?php ?>
     <link rel="stylesheet" type="text/css" href="components/com_lostrommel/views/lostrommel/tmpl/table.css">
     <?php
     
    $query 
    "SELECT * FROM #__lostrommel_guestbook Where recieverid = ".(int)$profileid." ORDER BY date DESC";
    $db->setQuery($query); if ( !$db->query() ) { echo "<script type='text/javascript'> alert('".$db->getErrorMsg()."'); </script>"; return false; } else { 
    $rows $db->loadObjectList(); } 
     if (empty(
    $rows)) { ?>
        <br><br><div align="center"><img src="http://www.joomlaportal.de/images/totehose.jpg" align="center" alt="Keine Eintr&auml;ge" width="230" height="250"></div><?php
    } else {
     
    ?>

    <div class="tbody"></div><br><table ><div class="tbody"><td>Von</td><td>Bild</td><td>Headline</td><td>Text</td><td>Datum</td>
    <?php foreach( $rows as $row ) {  

     
    $query "SELECT thumb FROM #__community_users WHERE userid = ".(int)$row->senderid."";
     
    $db->setQuery($query); 
     
    $thumb $db->loadResult();
     
    $query "SELECT username FROM #__users WHERE id = ".(int)$row->senderid."";
     
    $db->setQuery($query); 
     
    $sendername $db->loadResult();
     
    $datum date("d.m.Y",(int)$row->date);
     
    $uhrzeit date("H:i",(int)$row->date);
     
    $text $row->text;
     
       
    $text=str_replace(":DD",'<img src="components/com_lostrommel/smileys/grin.png" border=0 height=30 width=30>',$text);
    ?>
     <tr><td><a href = "index.php?&option=com_community&view=profile&userid=<?php echo (int)$row->senderid ;?> "><?php echo $sendername?></a>
    <td/><a href = "index.php?&option=com_community&view=profile&userid='.(int)$row->senderid.'"><img src="<?php echo $thumb;?>" width="60" height="60" alt="BILD"></a>
    </td><td>
    <?php echo htmlspecialchars$row->headlineENT_QUOTES'UTF-8' ); ?>
    </td><td><div class="ssmed">
    <?php echo $text;?>
    </div></td><td>
    <?php echo $datum.'<br>'.$uhrzeit.' Uhr';?>
    </td></div></tr>
     <?php }} ?> 
     </div></table>        
    <?php 


    function 
    show_my_guestbook() {
     
    $user = & JFactory::getUser();
      
    $userid $user->get('id');
      
    $username $user->get('username');
      
    $profileid JRequest::getInt('profileid');
      
    $read JRequest::getInt('read');
      
    $db = &JFactory::getDbo();
      
    $message JRequest::getInt('message');

     if(
    $message=="1") { echo JText::_'lostrommelENTRYDELETESUCCESS' ).'<br>';
    } else if(
    $message=="2") { echo JText::_'lostrommelENTRYDELETEFAILED' ).'<br>'; }

    if (
    $read=1) {
        
    $query "UPDATE #__lostrommel_guestbook SET unread = 0 WHERE recieverid=".(int)$userid."";
        
    $db->setQuery($query); 
        
    $result $db->query();
        if (
    mysql_errno()) die ("MySQL-Error: " mysql_error());
        }
     
      echo 
    $username."'s Guestbook";
      
    ?><link rel="stylesheet" type="text/css" href="components/com_lostrommel/views/lostrommel/tmpl/table.css">
    <?php
    $query 
    "SELECT * FROM #__lostrommel_guestbook Where recieverid = ".(int)$userid." ORDER BY date DESC";
    $db->setQuery($query); 
    if ( !
    $db->query() ) { 
         echo 
    "<script type='text/javascript'> 
                alert('"
    .$db->getErrorMsg()."'); 
                </script>"

           return 
    false
       } else { 
     
    $rows $db->loadObjectList();
     } 
        if (empty(
    $rows)) { ?>
        <br><br><div align="center"><img src="http://www.joomlaportal.de/images/totehose.jpg" align="center" alt="Keine Eintr&auml;ge" width="230" height="250"></div><?php
    } else { ?>
    <div class="tbody"></div><br><table ><div class="tbody"><td>Von</td><td>Bild</td><td>Headline</td><td>Text</td><td>Datum</td><td>l&ouml;schen</td>
     <?php
       
    foreach( $rows as $row ) {  
     
      
    $query "SELECT thumb FROM #__community_users WHERE userid = ".(int)$row->senderid."";
      
    $db->setQuery($query); 
      
    $thumb $db->loadResult();
      
    $query "SELECT username FROM #__users WHERE id = ".(int)$row->senderid."";
      
    $db->setQuery($query); 
      
    $sendername $db->loadResult();
      
    $datum date("d.m.Y",(int)$row->date);
      
    $uhrzeit date("H:i",(int)$row->date);
      
    $eraseentrylink='<a href="index.php?option=com_lostrommel&todo=eraseentry&site=guestbook&id='.(int)$row->id.'"><img src="http://www.joomlaportal.de/images/cancel_f2.png" alt="l&ouml;schen" width="15" height="15"></a>';
      
    $text=$row->text;
     
       
    $text=str_replace(":DD",'<img src="components/com_lostrommel/smileys/grin.png" border=0 height=30 width=30>',$text);
     
    ?>
    <tr><td><a href = "index.php?&option=com_community&view=profile&userid=<?php echo (int)$row->senderid;?>"><?php echo $sendername;?></a><td/>
    <a href = "index.php?&option=com_community&view=profile&userid=<?php echo (int)$row->senderid;?>"><img src="<?php echo $thumb;?>" width="60" height="60" alt="BILD"></a></td><td>
    <?php echo htmlspecialchars$row->headlineENT_QUOTES'UTF-8' ); ?>
    </td><td><div class="ssmed">
    <?php echo $text?>
    </div></td><td>
    <?php echo $datum.'<br>'.$uhrzeit.' Uhr'?>
    </td><td>
    <?php echo $eraseentrylink?>
    </td></div></tr>
    <?php ?>
    </div></table>
    <?php }} 

    function 
    compose_guestbook_entry() {
    $user = & JFactory::getUser();
     
    $userid $user->get('id');
     
    $username $user->get('username');
     
    $profileid JRequest::getInt('profileid');
     
    $submit JRequest::getVar('submit');
     
    $timestamp time();
      
      
    $db = &JFactory::getDbo();
      
    $query "SELECT username FROM #__users WHERE id = ".(int)$profileid."";
      
    $db->setQuery($query); 
      
    $profilename $db->loadResult();

    if (isset(
    $submit)){
      
    $headline JRequest::getVar('headline');
      
    $textbox JRequest::getVar('textbox');
      
    $link '<a href="index.php?option=com_community&view=profile&userid='.(int)$profileid.'">'.JTEXT::_('GUESTBOOKREDIRECT4').'</a><br><br>';

    if (
    $userid!=$profileid) {
    $query "INSERT INTO #__lostrommel_guestbook" "\n ( `senderid`,`recieverid`,`date`,`headline`,`text` )" "\n VALUES" "\n ( ".(int)$userid.",".(int)$profileid.",".(int)$timestamp.",'$headline','$textbox');";
    $db->setQuery($query); 
    $result $db->query();
    if (
    mysql_errno()) die ("MySQL-Error: " mysql_error());

    echo 
    JTEXT::_('GUESTBOOKCOMPOSEFINISH1').' '.$profilename.' '.JTEXT::_('GUESTBOOKCOMPOSEFINISH2');
    ?>
    <br><br><br><img src="http://www.joomlaportal.de/images/checkmark.jpg" align="right" "alt="" width="80" height="90" border="2">
    <meta **********=********* content="3; url=index.php?option=com_community&view=profile&userid=<?php echo (int)$profileid;?>">
    <br><br>
     <?php echo JTEXT::_('GUESTBOOKREDIRECT').$profilename.JTEXT::_('GUESTBOOKREDIRECT2').'<br><br>'.JTEXT::_('GUESTBOOKREDIRECT3').$link?>
    <br>
    <?php
    } else {
      echo 
    JTEXT::_('GUESTBOOKMISTAKE');
    }} else {
      echo 
    $profilename.' '.JTEXT::_('GUESTBOOKCOMPOSE').'<br>';
    ?>

    <script languag="JavaScript">
          function addsmiley(smiley)
            {
              document.guestbook.textbox.value=document.guestbook.textbox.value+' '+smiley;
              document.guestbook.textbox.focus();
            }
        </script>
        <a href="javascript: addsmiley(':DD')"><img src="components/com_lostrommel/smileys/grin.png" alt="" width="60" height="60" border="0"></a>

    <form id="guestbook" name="guestbook" action="index.php?option=com_lostrommel&todo=guestbook&extension=composeguestbookentry&profileid=<?php echo (int)$profileid?>" method="post"><br>
    Headline: <br><textarea name="headline" cols="60" rows="1" value="<?php echo htmlspecialchars$headlineENT_QUOTES'UTF-8' );?>"></textarea><br>
    Text:<br><textarea name="textbox" size="300" cols="60" rows="10" value="<?php echo htmlspecialchars$textENT_QUOTES'UTF-8' );?>"></textarea><br>
    <input type="submit" name="submit">
    </form>
    <?php
    }}
    ?>
    Wie schaffe ich es nun die Datenbankabfragen zu reduzieren ? Oder vielleicht eine nicht so rechenintensive Abfragealternative ?
    Ist das Script denn jetzt gegen MySql Injection geschützt ?
    Und eine Frage noch .. bedeutet das DB Error Management das ich hinter jeder Abfrage mit
    getAffectedRows() bzw. getNumRows() prüfen soll ob die Abfrage auch geklappt hat und wenn nich Fehler anzeigen ?

    Hoffe geh nich zu doll auf die Nerven, aber würd so gern meine Scripte etwas dem Standard näherbringen


    Lg
    tobi

    Lg
    Tobi
    Gandii.de -> coming soon

  8. #6
    Verbringt hier viel Zeit
    Registriert seit
    31.05.2008
    Beiträge
    801
    Bedankte sich
    0
    Erhielt 268 Danksagungen
    in 214 Beiträgen

    Standard

    Ich bin mal ganz böse und behaupte, dass du zum Teil nicht weißt, was da überhaupt passiert:

    PHP-Code:
    defined('_JEXEC') or die('Restricted access'); 
    require_once (
    JPATH_COMPONENT.DS.'controller.php'); 
    $controller = new lostrommelController();
    $controller->executetrue ); 
    $controller->redirect(); 
    Das ist irgendwie das einzige, was ein bisschen nach Joomla!+MVC aussieht. Nur: Warum ist das da drin, wenn du eh alles in einer Datei verarbeitest?

    ----

    PHP-Code:
    $language = &JFactory::getLanguage(); 
    $language->load('com_lostrommel'JPATH_BASE .DS.'components'.DS.'com_jwallet'); 
    Sprachdateien kannst du bei der Installation in den globalen "language"-Ordner legen lassen. Wenn die Dateien dann richtig beannt worden sind, werden Sie von Joomla! automatisch geladen.

    ----

    PHP-Code:
    switch ($task){
    case 
    "showuserguestbook":
        
    show_user_guestbook($option);
        break;
    case 
    "showmyguestbook":
        
    show_my_guestbook($option);
        break;
    case 
    "composeguestbookentry";
        
    compose_guestbook_entry($option);
        break;
        default:
        
    compose_guestbook_entry($option);

    Sowas solltest du lieber über verschiedene Views lösen.

    ----

    PHP-Code:
     $user = & JFactory::getUser();
     
    $userid $user->get('id');
     
    $username $user->get('username');
     
    $profileid JRequest::getInt('profileid');
     
    $db = &JFactory::getDbo();
     
     
    $query "SELECT username FROM #__users WHERE id = ".(int)$profileid."";
     
    $db->setQuery($query); 
     
    $profilename $db->loadResult();
     echo 
    $profilename."'s Guestbook"
    Das ist irgendwie doppelt gemoppelt, wenn du schon ein JUser Objekt hast, warum holst du dir dann nocheinmal die Infos aus der Datenbank?

    PHP-Code:
     $user = &JFactory::getUser(); // Aktuelles User laden
     
    $profileid JRequest::getInt('profileid');
     
    $profileuser = & JFactory::getUser($profileid); // User des Profils laden
     
    echo $profileuser->get('username')."'s Guestbook"
    ----

    PHP-Code:
     if ($userid!=$profileid){ 
    PHP-Code:
     if ($user->get('id') != $profileuser->get('id')){ 
    ----

    HTML-Code:
     <link rel="stylesheet" type="text/css" href="components/com_lostrommel/views/lostrommel/tmpl/table.css">
    PHP-Code:
    JHTML::_('stylesheet''table.css''components/com_lostrommel/views/lostrommel/tmpl/'); 
    ----

    PHP-Code:
    if ( !$db->query() ) { echo "<script type='text/javascript'> alert('".$db->getErrorMsg()."'); </script>"; return false; } else { 
    $rows $db->loadObjectList(); } 
    Hier wird 2 mal das selbe Query abgefragt, das ist unnötig.

    PHP-Code:

    $rows 
    $db->loadObjectList();

    if ( 
    $db->getErrorMsg() ) {
    JError::raiseError(404$db->getErrorMsg());

    ----

    PHP-Code:
     $datum date("d.m.Y",(int)$row->date);
     
    $uhrzeit date("H:i",(int)$row->date); 
    PHP-Code:
    $date = &JFactory::getDate($row->date);
    echo 
    $date->toFormat(JText::_('DATE_FORMAT_LC4')); // Datum
    echo $date->toFormat('%H:%M'); // Zeit 
    ----

    PHP-Code:
    $img JHTML::_('image''components/com_lostrommel/smileys/grin.png'':DD');
    $row->text str_replace(':DD'$img$row->text); 
    ----

    PHP-Code:
    if (mysql_errno()) die ("MySQL-Error: " mysql_error()); 
    s.o.

    ----

    PHP-Code:
    $query "INSERT INTO [...] 
    JTable
    JDatabase

    ----

    HTML-Code:
    <img src="http://www.joomlaportal.de/images/checkmark.jpg" align="right" "alt="" width="80" height="90" border="2">


    ----

    HTML-Code:
    <meta **********=********* content="3; url=index.php?option=com_community&view=profile&userid=<?php echo (int)$profileid;?>">
    PHP-Code:
    $mainframe = &JFactory::getApplication();
    $link JRoute::_('index.php?option=com_community&view=profile&userid='.$profileid);
    $mainframe->redirect$link ); 
    ----

    Zitat Zitat von rollerueckwaerts Beitrag anzeigen
    Hoffe geh nich zu doll auf die Nerven, aber würd so gern meine Scripte etwas dem Standard näherbringen
    Dann informier dich einfach über die Joomla! MVC Struktur
    lg Måria

  9. Erhielt Danksagungen von:


  10. #7
    War schon öfter hier
    Registriert seit
    23.05.2007
    Ort
    Berlin
    Beiträge
    224
    Bedankte sich
    39
    Erhielt 6 Danksagungen
    in 6 Beiträgen

    Standard

    @ Maria:
    Danke für die Tipps, werd mich mal ranmachen das zu beheben. Voll Supi das du mir auch gleiche deine Lösungsvorschläge mitgegeben hast !!!
    Echt Danke !!

    ..Aber das ganze jetz komplett in die MVC-Struktur umzumodeln ist mir dann doch etwas zu viel. Vor 1.5 hat es doch auch niemanden gestört wenn alles in einer Datei wah und verändert ja auch nichts an der Funktionalität.

    Was mir halt viel wichtiger ist, ist das Thema Sicherheit. Möchte einfach wissen welche "NoGo's" es gibt und was ich in meinem Code verändern muss um ihn sicher zu gestalten.
    Ob der Code jetzt in einer Datei, oder schön in mehreren verteilt ist, darüber kann ich hinwegsehen

    Danke aber nochmal für eure Tipps schonmal. Werd die versuchen umzusetzen.

    Lg
    Tobi
    Gandii.de -> coming soon

  11. #8
    Verbringt hier viel Zeit
    Registriert seit
    31.05.2008
    Beiträge
    801
    Bedankte sich
    0
    Erhielt 268 Danksagungen
    in 214 Beiträgen

    Standard

    Zitat Zitat von rollerueckwaerts Beitrag anzeigen
    Vor 1.5 hat es doch auch niemanden gestört wenn alles in einer Datei wah
    Vor der Erfindung des Fernsehers hat sich auch niemand dran gestört, dass alle nur Radio hören konnten
    lg Måria

  12. #9
    Gehört zum Inventar
    Registriert seit
    18.02.2005
    Beiträge
    8.841
    Bedankte sich
    85
    Erhielt 2.269 Danksagungen
    in 1.936 Beiträgen

    Standard

    Vor 1.5 hat es doch auch niemanden gestört wenn alles in einer Datei wah und verändert ja auch nichts an der Funktionalität.
    Das ist so nicht ganz richtig. Du handelst praktisch gegen die Konvention des Frameworks.
    Auch das sich praktisch nicht ans der Funktionalität ändert, ist kein Grund Code wie
    vor 15 Jahren zu schreiben. Heute plant, abstrahiert und programmiert man Software
    anders. Die Konvention ein MVC Konzept zu nutzen, folgt natürlich eine Idee. Auf der
    anderen Seite hast auch du recht, denn die Umsetzung einer Komponente im MVC
    benötigt mehr Ressourcen. Wenn es für dich reicht mach es so, aber bitte stell das
    nirgendwo zum Download bereit. Trotzdem wäre es natürlich gut, wenn du vielleicht
    einarbeitest.

    Möchte einfach wissen welche "NoGo's" es gibt
    Das kommt drauf an. Aus der Sicht eines Softwareentwicklers oder eines Bastlers?
    Alle Hinweise betreffen derzeit noch die Bastelebene. Wenn du einen Softwareentwickler
    fragen würdest, dann sagt der: Fang noch einmal von vorne an.

    PHP-Code:
    $profileuser = & JFactory::getUser($profileid); 
    Kleine Warnung. Existiert der User nicht gibt es einen Fehler. Ich weiß allerdings nicht,
    ob das in inzwischen ggf. geändert wurde.

+ Antworten

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein