Anonymní profil MartinB84 – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil MartinB84 – Programujte.comAnonymní profil MartinB84 – Programujte.com

 

Příspěvky odeslané z IP adresy 78.102.116.–

PHP › Bezradný a zoufalý - mysqli…
1. 3. 2016   #209007

Co mě trochu mrzí je, že jsem musel použít 2x tej samý dotaz jen načíst do rozdílné proměnné kvůli načtení počtu záznamů... Kdyby někoho napadlo, jak to udělat i bez toho... budu rád. Mě to nenapadlo, pač execute() je závislé na proměnné limit1 a limit2 a naopak num_rows je závislé na execute... chjo. No, hlavně, že to běhá.

PHP › Bezradný a zoufalý - mysqli…
1. 3. 2016   #209006

#4 Kit
Tak jsem to nakonec rozchodil. Díky moc za reakce, jen pro formu - dávám zde kompletní a plně funkční řešení - doufám, že ten zdroják není tak strašnej :D pokud ano, omlouvám se, jsem amatér

// Vytvoření dotazu a stránkování pro výběr
                  if($_GET['searchpage']!="") {
                    // Dotaz na SQL kvůli počtu nalezených výsledků pro stránkování
                    $dotazsearchpage_pager = $connectsqli->prepare("SELECT * FROM restaurace WHERE mesto LIKE CONCAT('%', ?, '%')");
                    $dotazsearchpage_pager->bind_param("s", $_GET['searchpage']);
                    $dotazsearchpage_pager->execute();
                    $resultsearch_pager = $dotazsearchpage_pager->get_result();
  
                    // Zjištění počtu nalezených záznamů
                    $pocet_zaznamu = $resultsearch_pager->num_rows;
                    
                    // Uložení výsledků hledání
                    $dotazsearchpage_pager->store_result();
                    
                    // Dotaz na SQL pro výpis hledaného obsahu
                    $dotazsearchpage = $connectsqli->prepare("SELECT * FROM restaurace WHERE mesto LIKE CONCAT('%', ?, '%') LIMIT ?,? ");
                    $dotazsearchpage->bind_param("sss", $_GET['searchpage'], $limit1, $limit2);
  
                    // Výpis nadpisu s počtem nalezených výrazů
                    echo "<h1> ".$_GET['searchpage']." (nalezeno $pocet_zaznamu podniků)</h1>";
                      
                    // Stránkování záznamů 
                    define ("ROWS", 30);
                      if (isset($_GET["celkem"]))  {
                        $celkem=$_GET["celkem"];
                      }
                      else  {
                        $celkem=$pocet_zaznamu;  
                      }
                      if ($celkem>ROWS) {
                        echo "<div class='strankovani-wrap'>";
                          if (!isset($_GET["od"])) $od=1; else $od=$_GET["od"]; 
                            $limit1 = $od-1;
                            $limit2 = ROWS;
                            echo "<div class='strankovani-text'>Výpis: ".$od."-";
                            echo (($od+ROWS-1)<=$celkem)?($od+ROWS-1):$celkem;
                            echo " z celkem $celkem položek</div>";
      
                            //začátek - vytvoř odkaz pouze pokud nejsme na začátku
                            if ($od==1) echo "<div class='strankovani-zacatek'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=1\" title='První stránka'><div class='strankovani-zacatek-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_zacatek_on.jpg'></a></div>";
                            
                            //zpět - vytvoř odkaz pouze pokud nejsme v prvních ROWS
                            if ($od<ROWS) echo "<div class='strankovani-predchozi'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=".($od-ROWS)."\" title='Předchozí stránka'><div class='strankovani-predchozi-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_predchozi_on.jpg'></a></div>";
    
                            //další - vytvoř, pouze pokud nejsme v posledních ROWS
                            if ($od+ROWS>$celkem) echo "<div class='strankovani-nasledujici'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."&celkem=$celkem&amp;od=".($od+ROWS)."\" title='Další stránka'><div class='strankovani-nasledujici-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_nasledujici_on.jpg'></a></div>";
    
                            //poslední - to je posledních (zbytek po dělení ROWS) záznamů
                            if ($od>$celkem-ROWS) echo "<div class='strankovani-konec'> </div>"; 
                            else echo "<a href=\"".$_SESSION['adresa_stranky']."?celkem=$celkem&amp;od=".($celkem-$celkem%ROWS+1)."\" title='Poslední stránka'><div class='strankovani-konec-on'><img src='".PORTAL_DOMAIN."/program/inc/default/images/icons/strankovani_konec_on.jpg'></a></div>";
                            echo "</div>";
                        }
                 }               
            
                  // Zobrazení vlastního obsahu vyhledávání
                  $dotazsearchpage->execute();
                  $resultsearch = $dotazsearchpage->get_result();
                  
                  while ($row = mysqli_fetch_array($resultsearch))  {  
                    require ROOT_DIRECTORY."/program/inc/default/templates/search_results.php";  
                  }  
MartinB84
PHP › SQL Injection - moje řešení…
28. 2. 2016   #208964

#4 ondrej39
Ale jo, všechno, co píšeš je naprostá pravda. Ale proč mi nikdo neodpovíte konkrétně? Jsem si vědom, že je to nestandardní, "amatérské" nebo říkejme tomu jak chceš, ale pojďme se chvíli bavit konkrétně:

1. Neprogramuji aplikaci pro další dynamické využití... Je to zcela unikátní a specifická záležitost.

2. V ČEM konkrétně může mé řešení aplikaci uškodit? Jedná se o problém výkonostní nebo to prolomíte nebo kde je ten problém tohoto řešení? Od diskuze jsem očekával diskuzi a ne strohé sdělení "je to amatérská pičovina". Sry.

MartinB84
PHP › SQL Injection - moje řešení…
28. 2. 2016   #208957

#2 Kit
Jak můžu použít prepare statements, když tu jasně píšu, že do proměnné z URL musím bohužel nacpat celý kus SQL dotazu... A druhá věc - zajímá mě názor na mé řešení a ne jiné alternativy - ve standardní aplikaci bych samozřejmě prepared statements použil..

MartinB84
PHP › SQL Injection - moje řešení…
28. 2. 2016   #208953

Ahoj všem,

rád bych znal názor zkušenějších na následující problematiku:

1. Programuji webovou aplikaci větších rozměrů. Je zde kladen velký důraz na bezpečnost celé aplikace a nyní jsem ve fázi, kdy řeším SQL injection - tedy ošetření formulářů a URL adres.

2. Ze specifických důvodů (nebudu rozvádět) musím použít v několika případech celé části SQL dotazu v proměnných, které předávám přes URL - např. výsledná $_GET['page'] = "p1 ='0' OR p1 = '1' "; - tato proměnná se následně vkládá přímo do SQL dotazu. Nemohu tedy použít na obrazu před SQL injekcí klasické opatření nahrazením proměnných např. otazníkem a jejich vložení do dotazu až následně. Stejnětak nemohu použít escapování (a ani nechci, je to starý a děravý způsob). Vymyslel jsem následující bezpečnostní řešení a rád bych znal vaše názory na něj, popř. jak ho prolomit :D

a) Ošetření proměnných přes URL: Vycházím z faktu, že každá proměnná předávaná URL adrese, ve které je potřeba použít část SQL dotazu má předem známé hodnoty (to je fakt v této aplikaci). Tzn. buď A nebo B nebo C. Proto v rámci zabezpečení nebudu předávat do SQL dotazu přímo proměnnou $_GET['x'], ale nejprve ji proženu přes podmínku if $_['x'] = výraz A nebo výraz B nebo výraz C - jen pokud je splněna tato podmínka, tak definuji proměnnou A, B nebo C a až tuto použiji v samotném SQL dotazu. Tím předpokládám, že URL adresy budou zcela neprůstřelné a 100% bezpečné. 

b) Ošetření formulářů (např. přihlášení apod): Použít escapování se mi nezdá bezpečné, umím jej prolomit :). První věc - pro psaný text používám TinyMCE a zde vnímám současné zabezpečení TEXTAREA vstupu uživatele jako dobré. Zbývá ošetřit prvky typu INPUT a zde zcela striktně proženu nejprve každou hodnotu z formuláře přes kontrolu tzn. ze speciálních znaků povolím pouze ampersant (ten se někdy používá v názvech např. hotel & restaurant), zbytek ze vstupu zcela odstraním (tedy veškeré druhy uvozovek, rovnítka, apod. a také slova jako DELETE či TRUNCATE apod.) a až teprve potom vložím výsledek do druhé proměnné a tu následně použiji v SQL dotazu... Prolomíte?

Díky všem za odpovědi. 

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý