- Luck Dragon: Asszociációs játék. :)
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- Gurulunk, WAZE?!
- gban: Ingyen kellene, de tegnapra
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- vrob: Az IBM PC és a játékok a 80-as években
- sziku69: Fűzzük össze a szavakat :)
- zebra_hun: Hűthető e kulturáltan a Raptor Lake léghűtővel a kánikulában?
- Magga: PLEX: multimédia az egész lakásban
Új hozzászólás Aktív témák
-
sztanozs
veterán
Akkor regex-el kapd el: [link]
$link='jAvascript';
echo $link . "\r\n";
$pattern = '/(&#(?:X[0-9a-f]*|0{0-8}*|{1-9}{0-9}*)(?!;))/i';
$replacement = '${1};';
$link = preg_replace($pattern, $replacement, $link);
echo $link . "\r\n";
$link = html_entity_decode($link, ENT_QUOTES);
echo $link . "\r\n"; -
Taci
addikt
válasz
sztanozs #20796 üzenetére
Igen, persze.
Egy "PHP Fiddle"-szerű helyen meg is csináltam egy kipróbálható és szerkeszthető példát: [link]
@disy68: Igen, és az alapján
A
lenne azA
karakter. [link]
A "baj" az, hogy a böngésző értelmezni tudja, aA
-bőlA
karaktert fordít, és így értelmezni is tudja. Ezt szeretném én is "elkapni", ellenőrizhetővé tenni, de nem megy. -
Taci
addikt
válasz
pelyib #20793 üzenetére
De király, köszönöm, ez nagy segítség lesz (FILTER_VALIDATE_URL).
A lenti problémát viszont továbbra is meg szeretném oldani.
@sztanozs:
Sajnos a html_entity_decode sem működik (írtam is az eggyel korábbi hozzászólásban).Még egy furcsaság:
$link = "A";
$dirty_content = "a";
$link = htmlspecialchars($link);
if (stripos($link, $dirty_content) !== FALSE){
echo "XSS-találat";
}
Erre meg bejelez...
De hát pont hogy a _decode-nak kellene ezt csinálnia... De nem, a _decode szépen kiírja, hogy ez bizony azA
karakter, viszont a változónak továbbra sem ez az értéke.Nagyon nem értem, mi folyik itt.
-
pelyib
tag
[filter_var] nem oldana meg?
-
Taci
addikt
Bocsánat a sok posztért, de igazából ez az egy probléma, ami megakaszt csak (és ez most XSS-től független, lehetne itt a string tartalma
Almafa
(Almafa) is, ugyanúgy nem menne):$link = "jAvascript:alert('Hacked!')";
$link = htmlspecialchars_decode($link);
echo $link;
Ez kiírja, hogy:jAvascript:alert('Hacked!')
És az oldal forrásában is ez van. Tehát aA
-et visszaalakítottaA
-ra.Viszont magának a változónak mégsem ezt adja értéknek, ott megmarad a A karakteres.
És ebbe az if-beif (stripos($link, $dirty_content) !== FALSE){
echo "XSS-találat";
}
csak akkor lép be, ha$dirty_content = "jAvascript:";
arra nem, hogy$dirty_content = "javascript:";
(se jAvascript-re persze)Ennek az egy rejtélynek a feloldásában kérnék csak segítséget, mert akárhogy keresem, próbálom, nem megy, nem értem.
-
Taci
addikt
Amúgy ajánlják ezt a fajta megközelítést is:
Another good prevention method is user’s input filtering. The idea of the filtering is to search for risky keywords in the user’s input and remove them or replace them by empty strings.
Those keywords may be:
<script></script> tags
Javascript commands
HTML markupÁrtani mindenesetre nem fog.
Ezt le tudom kezelni:
$link = "%3cScriPt%3ealert('Hacked!')%3c/script%3e";
(<ScriPt>alert('Hacked!')</script>)
mert először is visszaalakítom:$link_urldecode = urldecode($link);
aztán máris működik rá a keresés:$dirty_content = "<script>";
if (stripos($link_urldecode, $dirty_content) !== FALSE){
echo "XSS-találat: " . htmlspecialchars($dirty_content);
}
Ezt viszont továbbra sem tudom visszaalakítani:
$link = "jAvascript:alert('Hacked!')";
(jAvascript:alert('Hacked!'))
Se az urldecode(), se a htmlspecialchars_decode(), se a html_entity_decode() nem alakítja át ezt:A
ezzé:A
.Ez alapján ez HEX. Jó lehetne az urldecode() ide is, de az csak az
\X41
-re ugrik be, aA
-re nem.Nem foglalkoznék ez utóbbi esettel, csak hát ha az adatbázisban az egyik bejegyzés linkjét kicserélem erre
jAvascript:alert('Hacked!')
, akkor bizony kattintás után egyből látszik, hogy ha a böngésző nem fogná meg (about:blank#blocked), akkor futna, tehát valid kód. -
Taci
addikt
válasz
sztanozs #20787 üzenetére
Arra gondoltam, megcsinálom azt, hogy szűröm az adott kontextusban rosszindulatúnak számító kifejezésekre, és ha van benne ilyen, akkor megpróbálom "tisztítani" (vagy simán csak skip, mert ha már "fertőzött", akkor valid tartalomrész amúgy sem nagyon lesz benne).
Pl. ha kép linkjét várom, akkor abban nem lehet javascript, onerror, onfocus stb.
Viszont mivel nem csak a
javascript:alert('Hacked!')
valid, hanem ajAvascript:alert('Hacked!')
is, ezért így gondoltam az ellenőrzés (egy részét) megcsinálni:if (stripos(htmlspecialchars_decode($linkToCheck), $dirty_content) !== FALSE){
echo "XSS-találat!";
}
Ettől azt várnám, hogy ha
$linkToCheck = "jAvascript:alert('Hacked!')";
akkor ahtmlspecialchars_decode
ezt visszaírjajAvascript:alert('Hacked!')
-re,
astripos
pedig mivel case insensitive, így ha arra keresek, hogy "javascript:"$dirty_content = "javascript:";
akkor sikerül elkapni.De nem, a _decode nem, vagy nem úgy működik, ahogy várnám, és találatot itt továbbra is csak akkor ad, ha a speciális HTML entity-re keresek, pl.:
jA
Mit rontok el?
-
Taci
addikt
válasz
sztanozs #20785 üzenetére
Köszönöm (a JS topikban is) a linkeket. Ezeket már megtaláltam, átnéztem, értelmeztem (legalábbis folyamatban van.)
Ha html tagbe illesztesz be, akkor mindent célszerű kódolni, ami nem lehet URL-ben...
Itt erre gondolsz?
htmlspecialchars()&
(ampersand) becomes&
"
(double quote) becomes"
'
(single quote) becomes'
<
(less than) becomes<
>
(greater than) becomes>
----------
Az adatbázisba raktározó részt már régen csináltam, így most meg kellett néznem, mi-miért van.
És azt találtam, hogy mivel a különböző források eltérően kezelik a tartalmakat, össze-vissza kapom az adatot. Pl.:
Egyik helyről így kapom:
szöveg első része – szöveg másik része
(ez a "hosszabb" kötőjel: –)A másik helyről pedig már így:
szöveg első része – szöveg másik része
Ugyanígy az idézőjelekkel is pl.
Ezért eredetileg úgy csináltam, hogy mindegy, melyik forrásból érkezett az adat, így tároltam el:
htmlspecialchars_decode($description, ENT_QUOTES);
Megjelenítésre pedig így adtam át:
htmlspecialchars($description, ENT_QUOTES);
Ez mondjuk a "hosszabb" kötőjelen pont nem segített, de az a legkevesebb, átíratom majd, ha ilyet talál, írja át normál kötőjelre.
A kérdésem most az lenne, mivel már eléggé bekutyultam magam a sok új infóval és teendővel:
Ez-e a jó irány, hogy
htmlspecialchars_decode
használatával tároljam, és a megjelenítéshez menjen ahtmlspecialchars
?
Vagy eleve már a decode --> encode után kaptottat tároljam?Bocs, ha túl kézenfekvő dolgot kérdezek, de már nem látok tisztán.
Ez egy tisztább példa lesz:
$description = "&" . ' "' . " '" . " <" . " >" . " –"
. " &" . " "" . " '" . " <" . " >" . " –"
. " <b>bold text</b>";
Tehát mindkét változatban megkapom ezeket a karaktereket. Nekem ami fontos lenne, hogy:
- kijelezve "szépen" legyenek
- viszont a kódolás miatt ahtmlspecialchars
is használva legyen.Ezt jelenleg így tudom elérni.
$description = htmlspecialchars_decode($description, ENT_QUOTES);
$description = htmlspecialchars($description, ENT_QUOTES);
echo $description;
Kivéve a hosszabb kötőjelet, de az nem érdekel.
Az output:& " ' < > – & " ' < > – <b>bold text</b>
Mentsem akkor ezt a tartalmat (előbb dekód, aztán kód) az adatbázisba, és simán adjam át a HTML kódba illesztésre?
Bocs a hosszú megfogalmazásért.
-
Taci
addikt
Eljutottam oda, hogy az XSS elleni védelemmel is foglalkozni tudjak. Mivel egyelőre csak 1 user inputos rész van a weblapon, ez pedig a kereső, a kliens oldali része miatt a Javascript-topikba írtam.
Viszont aztán beugrott, hogy mivel RSS-csatornák tartalmával dolgozom, kvázi azok is külső források, amikből származó tartalmat ugyanúgy fenntartásokkal kell kezelnem. Hiszen ha a külső forrást támadják, és mondjuk átírják kártékony kóddal az RSS tartalmát, akkor ha ellenőrzés nélkül tárolom és használom az onnan származó adatokat, akkor azzal én is "fertőződöm".
Ennek szeretnék így hát elébe menni.
Ezeket az adatot szúrom be (jelen pillanatban ellenőrzés nélkül) a HTML kódba, ami ezekből a külső RSS forrásokból származik:
- cikkhez tartozó link
- képhez tartozó link
- cikk címe, leírásaItt ugye pl. az <img> tagnél lehet máris probléma, amit egyből reprodukálni is tudtam, mert ha az
<img src="
után egy eltérített "link" kerül be (pl.:http://url.to.file.which/not.exist" onerror="alert('Hacked!')"
), akkor máris bajban vagyok.
És ez ugyanúgy igaz lehet millió másik tagre, képnél, szövegnél, az összes ponton, ahova csak beszúrom ezeket a tartalmakat a HTML kódban.Van esetleg bevált megoldásotok ennek a problémának a kezelésére?
Így első keresésre ezt találtam: Sanitize filtersOlyasmi (talán-)megoldást tudok saját kútfőből, hogy csinálok egy funkciót, ahol az érintett adatokat átszűröm, és kiszedem belőle az összes lehetséges HTML tag-et és event-et. Ez egy hosszú lista lesz, viszont mivel egyik adatban (cikkhez tartozó link, képhez tartozó link, cikk címe, cikk leírása) sem szerepelhet ilyen (illetve leírásban már találtam, de az már ki van szedve), ezért ez talán egy jó módszer lehet.
Aztán olyanra is gondoltam, hogy ha az előbbi ("Hacked") példát nézem, hogy ott (<img src-nál) arra játszanak, hogy maguk rakják a záró idézőjelet (" vagy ' is lehet, gondolom), és utána a saját kódjukat hívják valamilyen event mögé pakolva. Így ha találok egy (elvileg csak) linkben " vagy ' karaktert, akkor azzal kezdődően levágom, és kész.
De ezek ilyen első gondolatos megoldási kísérletek. Ha van esetleg bevált megoldás rá, akkor nem pazarolnám erre az időt.
Köszönöm.
-
disy68
aktív tag
-
laracroft
senior tag
Sziasztok, kicsit béna vagyok és nem tudom EZT megoldani
Azt szeretném elérni, hogy a második sorban ne előröl kezdje a számok kiírását, hanem folytassa 1006-tól
előre is köszi -
-
disy68
aktív tag
Ahogy írtam is. Dropdown alapján kicserélném az iframe src attributumát.
-
-
válasz
Dr Bubo #20775 üzenetére
Köszönöm, megpróbáltom a tervemet ezzel.
Mike: Lényegében egy videóváltót akarok ezen a módon megcsinálni. Adott a környezet, fel van építve minden, és egy lenyíló form dönti el, hogy milyen URL kerüljön az adott helyre. Csak ezt JS-ben nem lehet megoldani ebben a formában, mert sok helyen van " és ' jel, amik felborítják a kódot. Ugyanis egy beágyazási Link így néz ki:
<iframe width="560" height="315" src="https://www.youtube.com/embed/vx2u5uUu3DE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
-
Mike
veterán
a php server oldali nyelv, ergo a szervernek adatokat kell küldeni
pl a kiválasztást elküldöd postban és azt írod ki aamit a szerver válaszol
vagy a form szerkezetét le tudod vele generálni, amire aztán írsz felszini kódot, ami valaidálja, kiírja az üzeneteket, stb, persze ezeket is lehet szedni adatbázisból:
itt pl. a php generálja a felszini js kódot is, így nem kell átadogatni a kírandó szöveget
persze ez arra nem alkalmas, hogy online nyelvet vltson a formon valaki kitöltés közben
szóval érdekelne mit is szeretnélrequest.onreadystatechange = function() {
if (request.status >= 200 && request.status < 400) {
// Success!
if(request.readyState == 4) {
alert("'.$szotar['mentes_sikeres'].'")
-
Sziasztok!
Segítségért fordulok hozzátok, mert megvallom, én inkább oldottam eddig meg mindent JS-el, mint PHP-val, így a PHP-s ismereteim elég karcsúak. Kokrétan az incude-ot, echo-t és apróbb txt fájlok szerkesztésén kívül nem csináltam még vele semmit, azonban most kénytelen leszek.
Adott egy Form kód, amely így néz ki:
<form id='formid'>
<select name='selectname'>
<option value='00'>Első választási lehetség</option>
<option value='01'>Második választási lehetség</option>
<option value='02'>Harmadik választási lehetség</option>
</select>
</form>Ez pedig hozzá a JS:
<script>
const DoIt = document.getElementById('formid').elements.namedItem('selectname');
DoIt.onchange = () => {
if (DoIt.value == '01') {
document.getElementById('Demo').innerHTML = 'Ez az egyes választás Demo üzenete!';
}
}
</script>Ezt szeretném átalakítani úgy, hogy PHP legyen. A PHP kódot valahogyan így képzelném el, hogy kinézzen:
const DoIt = document.getElementById('formid').elements.namedItem('selectname');
DoIt.onchange = () => {
if (DoIt.value == '01') {
$demo = 'Ez az egyes választás Demo üzenete!';
}
}Hozzá pedig az index.php-ban mindössze ennyi társulna:
<p><?php echo $demo ?></p>
Remélem érthető módon meg tudtam fogalmazni, hogy mit szeretnék. Van ötlet valakinek erre?
Előre is köszönöm!Szerk.: Nem kimondottan a példában szereplő mintát akarom felhasználni, így a Minek megoldani így, ha JS-ben is lehet? jellegű kioktatást kérlek mellőzzétek. Szükséges, hogy ez így legyen. Köszönöm
-
biker
nagyúr
válasz
supercow #20763 üzenetére
az a bibi, hogy a címek kb 70 adatbázisban vannak, mivel minden terem saját db, abban egy tábla. ezeket le tudom futtatni a saját szerveremen, de akkor le kell mentsem melyik emailcím melyik db melyik táblájából jött, és a verify után tudnom kell, melyik táblában kell javítani.
Ha lenne lehetőség helyben futtatni scriptet, akár cronnal lefogva 50-100/óra mennyiségre, akkor lekérem a címet, ellenőrzöm, ha jó hagyom, ha nem törlöm.
Ez is jó megoldás, csak munkásabb. Köszi -
supercow
őstag
Magad nem tudod ellenőrizni, SMTP szerverek ritkán válaszolnak VRFY meg egyéb requestekre, küldeni emailt ugye nem lehet/nem életszerű a te helyzetedben. Szerintem a legjobb amit tehetsz az a mailgun email checker api, fizetős de legalább megy.
-
biker
nagyúr
üdv, létezik e JÓ megoldás az emailek validálására és ez alapján az adatbázisokból eltávolítani a hibákat?
A gond az, hogy aki nem ad meg emailcímet, vagy teljesen hibás, az a filter_validate_emailre elbukik, de az elgépelések és emiatt nem kézbesíthetők, illetve a megszűnt fiókok még valid emailek maradnak, pl balazs helyett balasz , fremmail gmial és társai.
A mailer daemon emailfiókra jön, a küldő persze tojik törölni a visszajövők alapján, de ahogy nő a hibás cím, csökken a reputáció és nó a spam pontszáma a szervernek is.szeretnék lefuttatni egy scriptet az összes partnerünk (fitness termek) összes tagi adatbázisán, ami a közel 40-50ezer emailt ellenőrzi nem csak arra valid-e hanem létező cím-e, emailküldés és vegzálás nélkül.
ez hogyan lehetséges? fiókellenőrzés és a kapott válasz alapján törölni, de ne kapjon emailt a user?(nem kérek más hasonló megoldást, ami más problémát okoz, pl nincs dual-opt-in mert recepciós rögzíti az adatokat, nem lehet kiküldeni megerősítő emailt tagoknak mikor a pultnál állnak és regisztrálnak, szóval ilyen jellegű megoldások nem érdekesek)
-
biker
nagyúr
válasz
Dr Bubo #20756 üzenetére
igen, az ilyenek a jó trükkök.
Egyébként mára kiderült, hogy csak egyes régi rendszereink érintettek (ez egy fitnesz terem beléptető), és csak azok, ahol valaha publikus volt a regform
ahol pl most nem is publikus, de fél éve az volt, elkezdtek jönni a regisztrációk, miközben olyan oldalakra meg nem amiken soha nem volt kint.
lehet scraperrel beszedték, hol van elküldhető form és most próbálkoznak.
nem is a regisztrált adatokkal próbálnak belépni, nem is értem mire jó ez.
valami generált johndo69@blablamail.com címek és user jkhbhjfcgh passwor i7tr6rfut ezzel regel, de két belépő form van, egy a vendégeknek egy az adminoknak, és nem ezzel a random karakter sor a user sem a pass, látszólag ész nélkül elküldi a formokat egymás után, kb 6-7 órás szünetekkel -
Mike
veterán
válasz
Prog-Szerv #20734 üzenetére
bejöttem melóba
// az update-telendő adatok
$update_adat = [
"id" => 15,
"nev" => "Pista",
"email" => "pista@mail.hu",
"tel" => null];
// ez kerül be az update-be
$set_ertek = '';
// csak a mezok kellenek mezo = :mezo, id alapján updatelünk, ezért ez kimarad
foreach($update_adat as $mezo => $ertek) {
if($mezo != "id")
$set_ertek .= $mezo.' = :'.$mezo.',';
}
// levágjuk a vesszőt a végéről
if(!empty($set_ertek)) $set_ertek = substr($set_ertek, 0, -1);
// csak egy tételt akarunk updatelni, ezért a LIMIT 1
// ezt érdemes kiirni, kevébé cseszed el ha hibás az update
$update_sql =
'UPDATE akarmi
SET
'.$set_ertek.'
WHERE id = :id
LIMIT 1';
// prepare az sql, aztán beadjuk a tömböt neki
// fontos, hogy minden tömbelemet bindelni kell
try{
$update_res = $sql_conn->prepare($update_sql);
$update_res->execute($update_adat);
} catch (Exception $ex) {
echo $ex;
}
-
pelyib
tag
válasz
lanszelot #20751 üzenetére
Nincs cookie, se semmi.
session_start letrehozza a cookie-t.A login.php -ben van link a login.css-re, ami ott van mellette.
Ami linket eloallit (HTML-ben a href) azt nem a PHP (szerver oldal) hanem a bongeszo fogja ertelmezni es futattni. Tehat a /zoom/zoom.php egy olyan valaszt ad amiben a href="login.css" van, amit mar tudunk, h a sajat konyvtaraban fog keresni, tehat a /zoom-ban.
Nem, nem masol semmit! En ilyet tuti nem mondtam!ha nincs beírva semmi /üresen bök a gombra/, akkor
Ezt hogy vizsgalod pontosan? -
lanszelot
addikt
válasz
pelyib #20750 üzenetére
pontosítva:
felhasználo nevű tömbben van a 10 jelszósession_set_cookie_params(0);
session_start();
majd ha a létezik a $_SESSION[felhasznalo tömb] /azaz be lett már írva vmikor/ akkor felhasználó egyenlő $_SESSION[felhasznalo tömb] -al
error null /tehát nem kell beírni/
ha nincs beírva semmi /üresen bök a gombra/, akkor
felhasználó, és error is null
ha a beírt jelszó egyenló a tömbben szereplő egyikkel, akkor a felhasznalo egyenlő a beírttal, error null /tehát elfogadja/
ha beírt nem egyenló a felsoroltakkal, akkor felhasznalo null, error = hibas jelszohtml végén ha felhasználó null, akkor die
-
lanszelot
addikt
válasz
pelyib #20750 üzenetére
login.php csak egy jelszót kér. Van 10 fix jelszó és abból ha egyet jót írsz be beléptél, annyi.
Semmi több. Nincs cookie, se semmi. Leg alapabb védelem.
Van egy logout gomb, ami kiléptet, illetve a szerver kiléptet egy bizonyos idő után automatikusan.
Nos, ha a szerver kiléptet, ami 3 óra után tuti, akkor sem kéri a jelszót a könyvtárban lévő php, legyen az bármelyik php amit könyvtárba rakok.
Mi az, hogy feldobjam a login-t? Ezt nem értem.href="valami.jpg" - ilyen nics sehol. Ez csak a linkedre volt példa.
zoom könyvtárban lévő zoom.php igényli a login.php -t , ennyi
Nincs mas link.
A login.php -ben van link a login.css-re, ami ott van mellette.Tehát te azt mondod, hogy amikor igényli, akkor a login.php-t bemásolja a zoom könyvtárba, majd futtatás után vissza másolja? Mert csak így lehetséges, hogy a maga mellett lévő login.css -t nem éri el a login.php. Nem a zoom.php, az csak a login.php-t igényli meg.
-
pelyib
tag
válasz
lanszelot #20749 üzenetére
Tehát egy zoom könyvtárban lévő zoom.php ból require megy egy könyvtárral kijjebb a login.php -re.
Amit a zoom.php el is ér, de a login.css-t miért a zoom köntvtárban keresi?
Mikor a login.css -re a login.php -ban van hivatkozva ami mellette van.
Szerintem egy kicsit osszemosod a server es kliens oldali dolgokat. Te meg mindig a /zoom folderben vagy, igy a href="valami.jpg" az a /zoom folderre fog mutatni, de ez nem a PHP hibaja, igy mokodik a HTML. Ahogy linkeltem is, realtive path.Az a baj, h nem tudjuk, h a login.php mit csinal. Van e benne die / exit ami megallitja a futast? Definial function-t a login.php, meg kell hivni? Tippelek, de gondolom van egy session, annak a cookie path-a rendben van?
Felteszem, ha egy subfolderbol huzod be a login.php-t akkor egy olyan ag fut le ami ugy latja, h be vagy lepve. De igy latatlanban egymillio oka lehet. Happy debuggingNezd meg, h pontosan mi kell ahhoz, h feldobd a login-t, majd azt egyesevel debuggold.
-
lanszelot
addikt
válasz
pelyib #20748 üzenetére
A főoldalon kilépek, minden vele egy könyvtárban lévő oldalra be kell lépni, de ha másik könyvtárba van ott nem kér belépést /pedig ott a require be is írtam hogyan/
és belépés nélkül tudom használni, de csak ami alkönyvtárban van azt /pl zoom.php/
Ha kiteszem a könyvtárból,. akkor kér belépést, és a login.css is betöltődik.A képen a 404 az az hogy máshol keresi a login.css-t pedig beírtam hogy van az elérése, és a köntvtárak is ott vannak felsorolva.
Tehát egy zoom könyvtárban lévő zoom.php ból require megy egy könyvtárral kijjebb a login.php -re.
Amit a zoom.php el is ér, de a login.css-t miért a zoom köntvtárban keresi?
Mikor a login.css -re a login.php -ban van hivatkozva ami mellette van.
Miért lép vissza a zoom könyvtárba keresni?Illetve a könyvtárakban lévő php fileokban hiába ott a requirek, ami he nam futna le akkor el kellene szállnia, mert nem include, de ennek ellenére tovább megy, de ha pedig lefut, akkor miért nem indítja a login.php -t?
Minden file-ra igaz lesz ezek, ha könyvtárba rakom, és minden file jól működik, mihelyt kirakom a login.php mellé.
Tudom nagyon zavaros, de ezt csinálja, és ezért állok itt, hogy mi a szösz...
-
-
Prog-Szerv
csendes tag
"az adatbázisban engedd hogy null lehessen a mező"
Igen ezzel kezdtem.Le is teszteltem, ha beinsertelek valamit akkor null az érték.
"SET
mezo = :ertek
akkor megeszi a php nullt is"
Igen, csak ezt nem tudom, hogy pontosan hogyan csináljam...mindenképpen meg akarom tartani a jelenlegi dinamikáját a dolognak. -
pelyib
tag
válasz
lanszelot #20744 üzenetére
Ennek semmi koze a PHP-hez, generalsz egy HTML-t amiben a href="login.css" es meg mivel mindig a /zoom/zoom.php-ben vagy igy a browser a zoom/login.css-ben fogja keresni (=> "The "picture.jpg" file is located in the same folder as the current page" a linkelt oldalrol).
Ami neked kell az a relative path.
-
lanszelot
addikt
-
pelyib
tag
válasz
lanszelot #20742 üzenetére
Ezt nezd at: [HTML File Paths]
Amugy altalaban a static fajlokat egy kulon mappaba rakjak (pl: project-root/web/static, feltelezve, h a web folderben vannak a publikusan elerheto fajlok). -
lanszelot
addikt
Elérni mind a kettő eléri, csak más könyvtárban vannak.
De egyik se root -ban van.
Root-ba tenni se tudom, és nem is akarom.
Ez az egész project egy könyvtárban van.
Azon belül is vannak könyvtárak /pl a zoom/
login.php a project alap könyvtárában van, ott van a css is
login.php -ban így hivatkozok rá:<link rel="stylesheet" href="login.css">
mivel mellette van
zoom.php a loginra így hivatkozik:require __DIR__ . '/../login.php';
mivel az egy könyvtárral beljebb vanDe a require sem működik, ha csak beírom a zoom.php-t nem kéri a jelszót, beenged.
Ha kiveszem a könyvtárból, és a login.php mellé rakomrequire __DIR__ . '/login.php';
így viszont jól működik
Tehát valami a elérési linkkel lesz rossz. De mi?project/login.php
project/login.css
project/zoom/zoom.php -
Mike
veterán
válasz
Prog-Szerv #20737 üzenetére
igen, a nullhoz nem kell idézőjel, aposztrof
-
Mike
veterán
válasz
Prog-Szerv #20737 üzenetére
az adatbázisban engedd hogy null lehessen a mező
akkor írd idézőjelbe a nullt ha stringet adsz át
ha bindelet
SET
mezo = :ertek
akkor megeszi a php nullt is -
lanszelot
addikt
Hello,
Van egy login.php , ami mellett van egy login.css.
Ugyanitt van egy zoom könyvtár, amiben van a zoom.php
A zoom.php -nek nem kellene elindulnia ha nincs bejelentkezve vki.
Ekkor a login.php -ra ugrik.
Meg is nyitja a login.php -t, de a login.php nem éri el a login.css -t, mert a zoom könyvtárban keresi.
Ha simán a login.php -t indítom, akkor megnyitja a login.css -t is.
Csak ha köntvtárból hivatkozik rá vmelyik oldal akkor nem találja a css-t.
Hogy adjam meg a login.php -ban a login.css elérését, hogy, ha könyvtárból utalok rá akkor is tudja hol van?
-
Prog-Szerv
csendes tag
Igen, ez majdnem jó, csak ebben az esetben nem NULL szerepel az adatbázis táblájában miután lefut az update hanem üres mező (empty) Majdnem jó, de az lenne a legjobb ha adatbázis szerinti NULL értékem lenne. Abban az esetben ha nem sorolom fel a mezőt, pl unset-tel kiszedem akkor is ugyan ez a helyzet...
Erről már olvastam korábban hogy a PHP null és az SQL NULL nem ugyan az, és hogy a php null-t az SQL emptynek veszi. Úgy tudom az SQL NULL-t így lehetne neki megadni pl: SET valami=NULL <-aposztrófok nélkül, viszont a kód dinamikussága miatt abban az esetben ha valós adatom van kell az aposztróf....ezt leszámítva ez a dinamikus kód eddig nagyon jól bevált.
-
Mike
veterán
válasz
Prog-Szerv #20734 üzenetére
ha az akarod hogy null legyen, null-t kell írni, vagy nem sorolod fel a mezőt
if(empty($val)) $val = null;
-
Prog-Szerv
csendes tag
Sziasztok!
Van egy dinamikus update scriptem. hogyan tudnám azt megoldani, hogy olyan NULL értékeket is meg tudjak vele etetni, amit egy mysql adatbázis NULL-nak rögzít be. Íme a kódrészlet: ez az egész egy metóduson belül van ahol a $table és a $condition változókat átadom neki értelem szerűen.
$cols = array();
foreach($data as $key=>$val) {
$cols[] = "$key = '$val'";
}
$query = "UPDATE $table SET " . implode(', ', $cols) . " WHERE $condition";
-
biker
nagyúr
válasz
nevemfel #20730 üzenetére
"Bárki bárhonnan küldhet egy requestet a form feldolgozó oldalára. "
Hát ha bárhonnan küld, akkor nem lesz érvényes sessionID-je ami akkor generálódik amikor a login formot megnyitja, és ekkor tárolom le a tokent amit elküldök postba, és ha a session és post token nem egyezik akkor nem jó.
Ez akkor lehet sikeres, ha a loginformot megnyitja és elküldi, de ő beleír readonly mezőbe is és el tudja küldeni a foromot invalid esetén...----
Most annyit tettem rá, hogy nem js-el ellenőrzöm a captchat, hanem elküldés után a fogadó php-ben így kikerülve azt, amire még gondolok, js-t letiltják, és akkor nem fut le a validálás és el tudja küldeni a formot.
Így ha fogadáskor nincs captcha válasz, és az nem succes, akkor nem mentem le.
-
-
nevemfel
senior tag
Most akkor hogy tud elküldeni egy formot,
Bárki bárhonnan küldhet egy requestet a form feldolgozó oldalára. Megformáz egy ilyet, belerakja a paramétereket, és elküldi:
POST /post.php HTTP/1.1
Host: example.com
subject=subject&content=content
Ezek a védelmek nem arra szolgálnak, hogy ne lehessen post requestet küldeni, hanem hogy a requestet idejekorán kukázni lehessen, mert nincs captcha, nincs token, invalid a tokenérték, stb.
-
biker
nagyúr
válasz
nevemfel #20726 üzenetére
na most kérek igazán tanácsot..
felraktam a token generálást + ellenőrzést, és közben a naplót kiegészítettem azzal, hogy mentsen minden generált tokent és reg kisérletet
ugye ezzel elvileg csak úgy tudnák elküldeni a formot, ha a honlapon töltik ki és létrejön a token amit elment a sessionbe. ezután elküldi a formot
Azonban
1: a formot recaptcha védi, ki kell pipálni nem vagyok robot
2: van egy readonly mező amibe az új tag vonalkód generálódik, ezt is átírják, vagyis elég kizárt hogy az oldalon küldik a formot
Most akkor hogy tud elküldeni egy formot, amin van recaptcha és hogy tud közben átírni readonly mezőt, és hogy aktiválja az összes mező kitöltésig js-el disabled-re tett küldés gombot? hiszen van ugye bevitel ellenőrzés, kötelező mezők ki vannak-e töltve stb -
pelyib
tag
-
biker
nagyúr
Hali, hogy oldanátok meg, hogy "akárhonnan" ne lehessen form post-ot küldeni egy formot feldolgozó oldalra?
Hiába van recaptcha, nem a formot küldik el, hanem a html forrásból lemásolt formot kitöltve random adatokkal bombázzák a feldolgozó motort, ehhez ugye minden megvan a html-ben, nem nagy meló feldolgozni, lemásolni, és beküldeni az adatokat.
valahogy biztosra ellenőrizni, hogy a beküldött form a megbízható forrásból jön.
ehhez elég a referer ellenőrzés, vagy van valami kitalált megoldás? -
Taci
addikt
Működik szépen.
Arra kellett figyelni, hogy ha lett volna más paraméter is az id-k után, akkor a "..." operátor használata után azokat már (valamiért) nem engedte felsorolni (Cannot use positional argument after argument unpacking). Így azt úgy oldottam meg, hogy az elején csináltam egy tömböt, azt szépen sorban feltöltöttem minden változóval (push) és tömbbel (array_merge), amit paraméterként át akarok adni, és így a bind_param() funkcióban már csak ezt az új tömböt kellett átadnom.
Hátha ez később segít majd valakinek. -
Taci
addikt
-
Taci
addikt
7.3-as PHP-n vagyok (tesztgép).
Így viszont:
PHP Parse error: syntax error, unexpected '...' (T_ELLIPSIS)
(Elvileg 7.4-től működik csak a ... operátor.)Hogyan tudnám ezt helyettesíteni 7.3-ason?
Illetve hát nem értem. Itt azt írja, hogy ez az operátor már 5.6-os verzió óta működik.
-
Taci
addikt
Ezt a ...-os részt nem nagyon értem. (vagy csak megerősítésre lenne szükségem)
Eredetileg így hívtam (példa):
$stmt->bind_param("i", $limit);
Most, hogy belekerül az id-s rész is, első próbálkozásra így hívnám (példa):
$stmt->bind_param("i" . $bindString, $limit, ...$idArray);
Ez így jó lehet?
Mert ha jól értem, úgy kellene működnie, hogy ha mondjuk a $bindString-ben van három id-hoz tartozó integer-jelölés ("iii"), akkor ez egyenértékű lenne ezzel:
$stmt->bind_param("iiii", $limit, ...$idArray);
Az első "i" menne a $limit változónak, a maradék háromhoz pedig elvileg a ...-tal "rendelné hozzá" az $idArray elemeit.
Szóval ha a $limit = 4, az $idArray = array(0,1,2);
akkor ezzel lenne egyenértékű:$stmt->bind_param("iiii", 4,0,1,2);
Jól látom? Helyes lehet a hívás?
$stmt->bind_param("i" . $bindString, $limit, ...$idArray);
Ha nem, kérlek, javítsatok ki.Köszönöm.
-
Taci
addikt
Kifutottam a szerkesztési időből. Nem bind_params, csak bind_param.
És ahogy látom a leírásában
bind_param(string $types, mixed &$var, mixed &...$vars)
a típusok ($types) valóban sztring típusú, szóval akkor generálhatom is kedvem (szükség) szerint. -
Taci
addikt
$bindString = str_repeat('i', count($ids));
$stmt->bind_params($bindString, ...$ids);
Nem is tudtam/gondoltam, hogy a paraméter típusát jelölő karaktereket generálni is lehet...
Tehát ha mondjuk három elemű az id-kat tartalmazó tömböm, akkor generálok három i betűt ("iii") és kész?
Na amint a közelében leszek, megnézem, hogy tényleg ennyire egyszerű lenne-e...@Mike: Igen, átgondoltam, és azok kívülről érkeznek. Saját JS kódból, de akkor is kívülről. A kliensen generálódik, onnan jön - szóval abba bele lehet nyúlni.
@nevemfel: Igazából minden más tökéletesen működik vele, már csak ennyi hiányzik. Szóval ha nem muszáj, nem váltanék. Szóval ha csak a bonyolultsága miatt érné meg a PDO (és a linkelt cikkből így látom, és korábban más forrásból is néztem már a különbségeket), akkor ha már egyszer megírtam így, és jól is működik, nem bántom.
Köszönöm.
-
Taci
addikt
Mármint hogy ne legyen paraméterezés? Vagy nem értem. Pont a paraméterezés lenne a lényeg, mert így ha valahogy az egyik érték helyére bejuttatnak egy kártékony kódrészletet, akkor bajban leszek. (a pár hozzászólással ezelőtt tárgyalt SQL injection-támadhatóság)
Azt látom itt problémának, hogy ugye mivel dinamikusan változik a változók száma, nem tudom ráhúzni a sémát, és simán beírni, hogy
$stmt = $mysqli->prepare("... WHERE id NOT IN (?,?,?)");
$stmt->bind_param('iii', 0,1,2);
(vagy változókkal, most mindegy, csak példa)És így ha valamelyik érték helyett bekerül egy "rossz kód", akkor általa támadva lehetek.
Ugye erre lenne védelem a paraméterezés, csak mivel változó, hogy mennyi elem van ennél a résznél átadva, nem tudom, hogyan lehet paraméterezni. -
Taci
addikt
bind_param, ezzel kapcsolatban kérdeznék.
Adott egy olyan lekérdezés, amiben van egy változó tartalmú rész, pl.:
WHERE id NOT IN (0), máskor NOT IN (0,1,2,3), vagy NOT IN (0,1,2,3,4,5,6,7,8,9) stb.Tehát a zárójelen belül lehet akár 1, akár 11 érték is, változó.
Ha simán csak stringként adom át, akkor nem működik. Pl.:
$id_list = "0,1,2,3,4,5,6,7,8,9";
$stmt = $mysqli->prepare("... WHERE id NOT IN (?)");
$stmt->bind_param('s', $id_list);
(Nincs előttem a kódom most, de kb. így lehet. Plusz azok az id-k belső kódból jönnek, így lehet, le sem kellene védenem őket, de talán jobb lenne biztonságban tudni.)
Itt látok pont most talán egy ide illő megoldást: ReflectionClass (sose láttam még).
https://www.php.net/manual/en/mysqli-stmt.bind-param.phpComing to the problem calling mysqli::bind_param() with a dynamic number of arguments via call_user_func_array() with PHP Version 5.3+, there's another workaround besides using an extra function to build the references for the array-elements.
You can use Reflection to call mysqli::bind_param(). When using PHP 5.3+ this saves you about 20-40% Speed compared to passing the array to your own reference-builder-function.
Example:
<?php$db = new mysqli("localhost","root","","tests");
$res = $db->prepare("INSERT INTO test SET foo=?,bar=?");
$refArr = array("si","hello",42);
$ref = new ReflectionClass('mysqli_stmt');
$method = $ref->getMethod("bind_param");
$method->invokeArgs($res,$refArr);
$res->execute();
?>Otthon utána olvasok majd (munkanap végén).
Van ezzel tapasztalatotok? Hogyan lehetne ezt megoldani?
-
Mike
veterán
na megvan a select is
if($node->tagName == 'select') {
$options = $node->getElementsByTagName('option');
foreach($options as $tag) {
$tag->removeAttribute('selected');
$tag_value = $tag->getAttribute('value');
if($tag_value == $be[$name])
$tag->setAttribute('selected', true);
}
}
elnézést ha valakinek ebben semmilyen új információtartalom nem volt, de hátha lesz olyan akinek meg jól jön
-
Mike
veterán
sziasztok
adott egy html, amihez postban jönnek értékek, ezekkel kéne a feltölteni a html-t, mindeféle vagdosás és szövegek keresése helyett. gondoltam erre pont jó a Domdocument, csak még életemben nem használtam
a textarea már oké, azt szépen beteszi a nodeValue, de az input, select-et nem
illetve van 2 gomb amiről le kéne szedni a disabled-et$dom = new DOMDocument();
$dom->loadHTML($munka_html);
$xpath = new DOMXpath($dom);
$col = $xpath->query('//input|//textarea|//select');
if(is_object($col)){
foreach( $col as $node ) {
$name = $node->getAttribute('name');
$node->nodeValue = $be[$name];
}
}
$be az a post bejövő értékek
ez textareanál oké
de se a select, se a sima input nem megyilletve jó lenne tudni az input type értékét is, hogy az input buttonnak ne adjon értéket
illetve az input type="button" -nál szedje le a disabled attribútumot -
lanszelot
addikt
válasz
nevemfel #20702 üzenetére
Xampp olyan biztonsági dologhoz kér hozzáférést, hogy hanyagoltam.
Ampps -ban nincs config file, ott böngészőben van minden mint egy router nél.
Akkor maradok a parancssornál.Más kérdés: van egy Array amiben file nevek vannak /123.jpg, 456.jpg/
Az index.php mellett van egy könyvtár, abban a képek, össze szeretném hasonlítani, a tömb ben lévő képek közül melyik van a könyvtárban is, csak azok maradjanak az Array ben amik a könyvtárban is vannak.
Ezt hogy tudom megcsinálni? -
lanszelot
addikt
Hello,
Feldobtam az AMPPS -ot, de nem találom, hogy hol tudom át állítani a localhost könyvtárat.
Tudom, hogy alapból C:/Program Files/Ampps/www
de az nekem nem jó./D: re szeretném, saját könyvtárba/
Hol lehet át állítani?
Új hozzászólás Aktív témák
Hirdetés
- SD-kártyát vennél? Ezért ne csak a GB-ot nézd! – Tech Percek #9
- A fociról könnyedén, egy baráti társaságban
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Macron betiltatná az EU-ban a közösségi médiát a 15 év alattiaknak
- Gaming notebook topik
- Atomenergiával dübörögnek tovább az Amazon adatközpontok, SMR-ek is jöhetnek
- Luck Dragon: Asszociációs játék. :)
- Plazma TV topic
- Háztartási gépek
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- További aktív témák...
- Apple Ipad 10.generáció
- Új HP Pavilion x360 14-ek Érintős hajtogatós Laptop Tab 14" -35% i5-1335U 8/512 FHD IPS Iris Xe
- RTX 4080 SUPER,16GB. Ryzen 7 7800X3D, 32 RAM Fury RGB! Garancia!
- Asztali PC , i7 9700K , RX 5700 XT , 32GB DDR4 , 500GB NVME , 1TB HDD
- Dell Inspiron 5406 2-in-1i5-1135G7 16GB DDR4 3200 512GB NVME 14" FHD Érintőkijelző W11Pro
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: CAMERA-PRO Hungary Kft
Város: Budapest