« 1 2 »
Autor Zpráva
SkyVessel
Profil
Ve formuláři zadávám jméno uživatele, které se má smazat:
    if (isset($_POST['del'])) { //zpracování formuláře
 if (isset($_POST['jmeno_del'])) {
  if ($_POST['jmeno_del'] != "") {
    $jmeno_del = trim($_POST['jmeno_del']);
   }
  $dotaz = "SELECT id FROM users WHERE jmeno='$jmeno_del'";
  $vysledek = @mysql_query($dotaz);
  if (mysql_num_rows($vysledek) == 1) { //jestli se nick nachází v databázi
   $dotaz = "DELETE FROM users WHERE jmeno ='$jmeno_del'";
   $vysledek = @mysql_query($dotaz); //spustit dotaz
   rmdir ("private/$jmeno_del");   //smaže adresář
   if ($vysledek) {
    $zprava = $zprava."Uživatel $jmeno_del byl smazán.<br>";
    echo $zprava;
   }
  } else {
  $zprava = $zprava.'Vyplň jméno ke smazání!<br>';
}}}
    ...
    <form action="" method="post" name="delete" id="form_del">
Smazat: <input class="pole" name="jmeno_del" type="text" maxlength="20" > <input name="del" type="submit" value="Smazat"></form>
Chtěl bych ale nejdřív smazání potvrdit ve stylu Opravdu chcete smazat uživatele Příklad?.
Nevím, jestli jde obyčejný sprostý javascriptový okno nějak propojit s péhápéčkem nebo jestli se to dělá jinak?
Keeehi
Profil
V tomto případě to nemá s PHP co dělat.
Formu stačí přidat:
onsubmit="return confirm('Opravdu chcete smazat uživatele '+this.jmeno_del.value+'?')"

Je to řešení závislé na javascriptu. Pokud bude vypnutý, smaže se to bez dotazování.
SkyVessel
Profil
Keeehi:
HA! Díky. Věděl jsem, že se to dělá nějak takhle, ale přidat to do formu mě nenapadlo. Díky

A ještě jeden dotaz trochu nesouvisející s tématem: Na serveru mám několik souborů php... Většinu mám v kódování utf-8, ale jeden jsem musel předělat do windows-1250, aby to fungovalo dobře. Ovšem u poloviny! utf-8 to hází místo některých českých znaků otazníčky a když změním kódování, tak se to rozbije totálně...
Nějaké tipy?
Keeehi
Profil
SkyVessel:
Všechno uložit do utf-8 a poslat tu část kódu, se kterou máš problém.
SkyVessel
Profil
Nemám problém s částí kódu. Prostě mám základní stránku (hlavička, kontrola přihlášení atd...). Tu si nakopíruji a jen měním obsah. Ale některé stránky se prostě zobrazí ok a některé stránky jsou celé místo ž je tam ? ... A menu co mám přes include je ok...
Keeehi
Profil
Všechny stránky uložte v utf-8. Zajistěte, aby ve výsledném html každé stránky byl v head tento metatag:
<meta http-equiv="content-type" content="text/html;charset=utf-8">
(nejlépe ještě před title)

Pak to by to nemělo dělat problémy.
SkyVessel
Profil
Přesně tohle tam mám (teda s mezerou před charset =D). Ale při bližším zkoumání jsem přišel na to, že to dělá jen na stránkách kde přistupuji do databáze... Ale dělá to jen u textu z php kódu - z dbs je to bez problémů (kódování dbs mám utf8_czech_ci)

EDIT: celá db je jako utf8_czech_ci, ale jednotlivé položky (jméno atd) mám nastavení jako cp1250_czech_cs, když to jakkoliv změním, tak se mi to zždy totálně rozsype. Taky mám nastaveno mysql_query("SET NAMES 'cp1250'")... Všude mi to takhle na jiných stránkách jelo bez problémů...
A ještě když vytvořím uživatele "ačřčřž" tak do db se uloží jako "ačřčřž" a při výpisu ti tam naháže ty otazníky v čtverci...
Keeehi
Profil
Zkuste po připojení k databázi zavolat:
mysql_query("SET NAMES 'utf-8'");

Jinak jste si jistý, že všechny soubory jsou v utf8? Pokud ne, raději všechny soubory otevřete a znovu uložte v utf8.
SkyVessel
Profil
Takže:
- na všech stránkách mám nastaveno utf8.
- na stránkách s přístupem do dbs to místo háčků a čárek píše "U�ivatel" (pouze u textu v php nebo html... ne u dat z dbs)
- když mám set_names na windows1250 tak do dbs se ukládá čaj - "xxÄ??™?©" ale s dbs se na stránky normálně vypíše "xxařřžé"
- když nastavím set_names na utf-8, tak mi to do dbs uloží čaj a na stránky to vypíše "xx�??�?�" tzn o pár otazníků navíc a ještě k tomu při uládání do dbs to vyhodilo chybu na řádek "if (mysql_num_rows($vysledek) == 0) { //jestli se nick nenachází v databázi" což v dbs nick určitě uložen nebyl...
nemeja
Profil
SkyVessel:
Budete muset sjednotit kodování, bud v souborech nastavíte Windows-1250 a nebo celou DB přehodíte do utf-8, tzn. přeuložit všechny udaje z DB. Na změnu kodování do UTF-8 je tu i funkce autoUTF
Keeehi
Profil
SkyVessel:
Problém může být v tom, že už data v databázi jsou pochroumaná. Když teď po sjednocení vložíte přes stránky do databáze nová data, ta nová data by se už měla zobrazovat správně.

pouze u textu v php nebo html
Nejlepší bude živá ukázka.
SkyVessel
Profil
Všechno upraveno na utf-8 - php, set_names i databáze. Do dbs jsem uložil xaéíáýžřč - v dbs je čaj ale vypisuje to správně. � jsem se ale nezbavil - viz obrázek. Jestli chcele live prewiew... tak private.nejenweb.cz

Keeehi
Profil
Soubor login.php nemáte uložen jako utf-8 ale jako windows-1250. (popřípadě includované soubory nemáte uložené správně)
Ale problém se nebude týkat jen souboru login.php ale i toho souboru, co je na 3. obrázku a možná i dalších. Nevím, jak se snažíte o uložení v utf8, ale rozhodně se vám to nepovedlo. Stáhněte si třeba PSPad. S tím jsem neměl problémy. Soubor stačí otevřít, nahoře v menu kliknout na Formát > klinkout na utf8, pak soubor uložit a zavřít.
SkyVessel
Profil
PSPad používám. Vše je jako utf-8...
Když jsem to zkusil změnit na windows1250 tak se nic nestalo. Ani v jiných prohlížečích. Když změním kodovaní v prohlížeči, tak se trojúhelníčky opraví, ale zase se pochopitelně rozhážou znaky z databáze...
Nepomohlo ani nové vytvoření souborů php přímo jako utf8...
Keeehi
Profil
SkyVessel:
Tomu se mi nechce věřit. Zabalte ty soubory do archivu a někam to nahrajte.
SkyVessel
Profil
Fakt si s tím nevím rady... zde je archív
heslo: ***
Keeehi
Profil
files.cejhon.cz/dat_uloziste.rar heslo stejné
4 soubory byly kódované jako windows-1250. To že je u nich v PSPadu u utf8 pod nabídkou ve Format takové to zatržítko ještě neznamená, že je i soubor v utf8. Jaké je skutečné kódování se zjistí dole ve stavovém řádku.
SkyVessel
Profil
Keeehi:
wow... čím víc se toho člověk dozvídá, tím víc chápe, jak málo toho ví =D
...takže jak se to teda překope do toho utf8?? Musím vytvořit nový soubor??
Keeehi
Profil
Stačí na to znovu klepnout i když je to zatržené. A dole ve stavovém řádku uvidíš změnu. Pak stačí jen uložit.
A nebo si stáhnout ten archiv. Tam už jsem to upravil.
LaMMa
Profil
SkyVessel:
Ak ti môžem poradiť, ošetri si postnuté hodnoty v login.php
SkyVessel
Profil
Keeehi
mg... já na to klikal jak praštěný!??!... no nic - teď už vím, k čemu je ten stavový řádek =o). A byl to ten problém - kódování je v pohodě, akorát do té databáze se to ukádá stále jako čaj - předpokládám že to je v tom windows1250 - má to cenu něco s tím dělat? respektivě jak to ošetřit, když mám dbs nastavenou na utf8 a nepomáhá to...

Jinak Keeehi, dávám ti palec nahoru nebo něco takového... Díky moc!! <3

EDIT: to v té dbs by asi šlo opravit tím ošetřením $_post jak psal LaMMa?
LaMMa
Profil
Ošetri $_POSTy pri dotazoch do DB napr. mysql_real_escape_string($_POST['...'])
Keeehi
Profil
$dotaz = "SELECT id, jmeno, datum_expirace FROM users WHERE jmeno='".mysql_real_escape_string($jmeno)."' AND password='".mysql_real_escape_string($pass)."'";
protože jinak, když někdo zadá do uživatelského jména tester' -- ' a k tomu jakékoli heslo, tak ho to přihlásí. Schválně to sám vyzkoušej.


Jinak jsou tem i jiné bezpečnostní problémy. Třeba soubor register.php není chráněn přihlášením, takže i nepřihlášení by mohli teoreticky mazat atd. Sice by museli vědět, že musí poslat POST požadavek del=xyz&jmeno_del=tennick, ale nemusí být přihlášení. Navíc i v tomto souboru jsou neooštřené vstupní proměnné.
SkyVessel
Profil
Keeehi:
nemusí být přihlášení
Tam ověřuji můj nick u proměnné post... tzn jestli jsem přihlášen JÁ...
Keeehi
Profil
SkyVessel:
To sice ano, ale po header na 22. řádku script nekončí a zpracovává se dál. Tohle dost začátečníků neví a myslí si, že to tím přesměrováním končí. Správně by jsi za tím měl mít ještě příkaz exit; Pak už by to bezpečné bylo.


Ještě to menu.inc by jsi si měl přejmenovat na php. Je ti vidět do kódu.


No aspoň že upload je zabezpečený a nedají se tam nahrát scripty. I když by se to dalo zapsat úsporněji (s využitím in_array), ale aspoň že takhle.
No zkrátka celá web je děravější, než cedník. Viz přihlašovací data do databáze, která se mi podařilo získat.
DEFINE ('DB_UZIVATEL', 'w20*******a');
DEFINE ('DB_HESLO', 'Tb*****P');
DEFINE ('DB_HOSTITEL', 'w*********.net');
DEFINE ('DB_DATABAZE', 'd20*******a');

Aspoň že ta hesla v databázi hashuješ.

Jak jsem se k těm údajům dostal? Využil jsem souboru down.php Má jen pár řádků, zkus přijít na to jak.


Je pravda, že bez těch zdrojových kódů, co jsem měl k dispozici by mi to trvalo mnohem déle, nebo bych na to vůbec nepřišel, protože pak je to někdy o tom si dobře tipnout, ale alespoň vidíš, kde všude máš bezpečnostní problémy. Jen aby sis nemyslel, že to je všechno. Zas tak důkladně jsem to nestudoval. Jen jsem spíš kouknul, kde by mohl být problém a většinou tam byl.-
SkyVessel
Profil
ad 1) díky, opraveno a poznačeno :)
ad 2) ups... tahle to mám z jedné knihy, ale vzpomínám si, že to tam bylo nějak ošetřeno v adresářové struktuře nebo tak něco... moje chyba. opraveno.
ad 3) ... no jak hacknout web jsem se taky neučil - moje chyba jak vidím =D. No napadá mě jedině, že jsi mi do proměnné nacpal nějak na sílu jinej adresář, který ti to pak ochotně vypsalo a ty už sis v klidu sosal data jako o život?? Trefa?
Zabezpečím to trochu více třeba tím, že bych ty data o dbs šoupnul v adresářové struktuře o úroveň výš??
ad 4) díky za kompliment :/... No naštěstí pro mě nejsem zajímavý pro fanoušky zdrojových kódů no a kdyby náhodou ano, tak budou zklamání obsahem =D... Zkusím si to celé projet s knihou v ruce a uvidíme, co ještě vymyslím...
Keeehi
Profil
Odkaz pro stažení je prostý down.php?down=../mysql_connect.php - prostě stačí, když v celé proměnné $_GET["down"] nebude lomítko.

Pravidla diskuse JPW a doporučení
SkyVessel
Profil
Keeehi:
Odkaz pro stažení je prostý
Zvláštní... Ať se snažím, jak se snažím, tak mi to přes ten odkaz akorát vysypalo 4x warning?!? =|
prostě stačí, když v celé proměnné $_GET["down"] nebude lomítko.
nějak jsem zmaten... tam přece žádné lomítko není... lol. Asi jsem unavený =D... ráno moudřejší večera
Keeehi
Profil
SkyVessel:
Možná že je špatně zapsaný název souboru, ale v čem útok spočívá je snad jasné.

tam přece žádné lomítko není
Ale je. Dokonce jsem ho i zvýraznil.
Jinak samozřejmě tím myslím, že v obsahu té proměnné se nesmí objevit lomítko.
SkyVessel
Profil
JOP... už jsem pochopil, jak jsi to myslel... Nedalo mi to spát =oD takže jeslti jsem to tedy pochopil správně:
  if (isset($_GET['down'])) {
    if (StrPos(" ".$_GET['down'], "/") != '0'){
    header ("Location: http://". $_SERVER['HTTP_HOST']."/logout.php");
    exit();
    }
    else {
      $soubor = "adresar/".$_GET["down"];
      if (!file_exists($soubor)) {
        header ("Location: http://". $_SERVER['HTTP_HOST']);
        exit();
      }
    }
  }
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: