Új hozzászólás Aktív témák
-
sztanozs
veterán
Igen, az in_array sinám végigiterál, amíg meg nem találja, míg a másik változat (key_exists) esetében azt a tulajdonságot abuzáljuk, hogy a kulcsok hash-elve vannak tárolva és sokkal gyorsabban kereshetők, mint maga az adat.
Mivel nincs rendes Set megoldás (illetve a DS/Set nincs alapból telepítve), így a tömb asszociatív kulcs keresés megoldását lehet abuzálni, hogy sebességben sikert érjünk el.
Ezzel a módszerrel tárolhajuk az összefüggéseket két irányból is:<?php
$kategoriak = array(
'szorakozas' => ['elozetes', 'film', 'sorozat', 'hbo', 'mozi'],
'kultura' => ['mozi', 'szinhaz', 'múzeum', 'koncert', 'film'],
'masszázs' => ['eufória']
);
$kulcsok = [];
foreach($kategoriak as $kat => $v) {
foreach($v as $kulcs) {
if (key_exists($kulcs, $kulcsok)) {
$kulcsok[$kulcs][] = $kat;
} else {
$kulcsok[$kulcs] = array($kat);
}
}
}
var_dump($kulcsok); -
Taci
addikt
válasz
sztanozs #20893 üzenetére
#20894: Ah, az azért már nem elhanyagolható sebességbeli különbség...
Csak jó lenne tudni ki is használni.
A Pythonba nem kezdenék bele, bőven elég ez is, köszönöm. Látod, ezzel sem haladok épp villámtempóban.
A tömbbe a kulcsszavakat kézzel írom bele. Jönnek külső forrásból a bejegyzések, hozzájuk az általuk megadott kulcsszavak, tagek, kategóriák, én pedig azokat rendezgetem magamnak a saját kategóriáimba. (Enélkül nagyon össze-vissza lenne minden, átláthatatlanul.)
Ezen a táblázatos tároláson el kell gondolkodnom, ki kell próbálnom. És igazán nem is értem.
Most simán csak in_array()-jel nézem meg, hogy az adott kulcsszó benne van-e valamelyik kategóriához tartozó kulcsszavai között. De ehhez ugye végig kell mennem a külső forrásból megadott kulcsszavakon (foreach), aztán a kategóriákhoz beállított kulcsszavakon is (foreach).
Ha táblázat van tömb helyett, az én tapasztalatommal kapásból feltöltenék egy tömböt a táblázat adaival, és foreach-et használék, hogy bejárjam. De sejtésem szerint nem ez az ajánlásod lényege.(A linkeket átnézem alaposan, amint odaérek. Köszönöm.)
Upd.: És azt is, amit most küldtél, még csak most látom, a hozzászólás elküldése után. Köszönöm szépen ismét a segítségedet és a türelmedet!
-
sztanozs
veterán
válasz
sztanozs #20895 üzenetére
és egy némileg lassabb implementáció PHP-ben:
<?php
$A = [];
$B = [];
foreach (range('A', 'Z') as $a){
foreach (range('A', 'Z') as $b){
foreach (range('A', 'Z') as $c){
$A[] = $a.$b.$c;
$B[$a.$b.$c] = 0;
}
}
}
echo count($A).'<BR>';
echo count($B).'<BR>';
$time_start = microtime(true);
for($i=0; $i<10000; $i++){
in_array('ZZZ', $A);
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo $execution_time.'<BR>';
$time_start = microtime(true);
for($i=0; $i<10000; $i++){
key_exists('ZZZ', $B);
}
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo $execution_time.'<BR>';
?>A különbség 1 sec vs 0.5 milisec.
-
sztanozs
veterán
Különbség a full list scan (foreach) és hashset között:
>>> # 456.976 elem listában
>>> A = ['AAAA', ..., 'ZZZZ']
>>> # 456.976 elem hasset-ben
>>> B = set('AAAA', ..., 'ZZZZ')
>>> # 2000 elem egy listában ami random négy karakter (~85% találati valószínűséggel)
>>> C = ['@ABC', ..., 'XYZ@']
>>> # keresés eredmények másodpercben
>>> timeit.timeit("[c in A for c in C]",number=1,globals=globals())
10.154
>>> timeit.timeit("[c in B for c in B]",number=1,globals=globals())
0.000786
Azaz míg 2000 elem megkeresése végigiterálva a félmilliós listában 10 másodpercig tart, addig ugyanannyi idő alatt 20.000.000 (húszmillió) elemet le lehet ellenőrizni egy félmilliós adattartalmú hashset-ben. -
sztanozs
veterán
Ezért is kell a kulcsszavakat és a kategóriákat táblázatban tárolni.
Ha táblázatban tárolod indexelve, akkor nem full table search lesz (azaz nem három egymásba ágyazott foreach), hanem Hash/B-Tree search, ami sokkal jobb.
De még két hashset/dictionary is jóval gyorsabb lenne, mint két lista.
https://www.php.net/manual/en/book.ds.php
http://docs.php.net/manual/en/class.splobjectstorage.php -
biker
nagyúr
Én a leírásból valami nagyon rekurzív megoldást látok.
amit írsz, az szerintem a klasszikus cimkézés, ahol egy rekordhoz a cimkék el vannak tárolva, és abban fulltext search a barátod, match against....
Ha nem akarod nagyon rekurzívvá tenni, akkor a cimkék is táblában
CimkeTabla id, cimke
Rekordok id, nev, akarmi, cimkek
és a cimkékben id-k felsorolva. De a fulltext search jól dolgozik indexelt táblákkal. -
Taci
addikt
válasz
sztanozs #20888 üzenetére
Mindenek előtt köszönöm, hogy kódot is írtál!
Viszont talán nem egy dologról beszélünk. (simán benne van, ti látjátok a jó utat, én meg továbbra is vakon vagyok)
SQL-lel nem lehet (jelen pillanatban) ezt megcsinálni, mert a kulcsszavak nem táblázatban vannak, hanem simán egy tömbben.
De amúgy ha a kulcsszavak táblázatban lennének, akkor sem lenne gyorsabb szerintem, sőt, hiszen azért csak gyorsabb egy kész tömbön végigmenni, mint előtte a tömb elemeit SQL-ből lekérni.Mutatok egy éles példát:
Külső forrásból ez a sztring érkezik:
$rekord_kulcsszavak = "Kultúra,előzetes,eufória,filmtv,hbo,második évad,rév marcell,sam levinson,sorozat,zendaya";Ezt szétbontom tömbbe, elemenként.
Ezeket az elemeket egyesével megnézem, milyen kategóriákhoz tartoznak (a kategóriákhoz tartozó kulcsszavak alapján), és azokat írom be a KUlcsokKAtegóriák táblába:
- Kultúra --> kultura
- előzetes --> szorakozas
- eufória --> nincs ilyen kulcsszó
- filmtv --> nincs ilyen kulcsszó
- hbo --> szorakozas, már benne van a kategóriában, skip
- második évad --> nincs ilyen kulcsszó
- rév marcell --> nincs ilyen kulcsszó
- sam levinson --> nincs ilyen kulcsszó
- sorozat --> szorakozas, már benne van a kategóriában, skip
- zendaya --> nincs ilyen kulcsszóTehát a rekordhoz a kultura és a szorakozas kategóriák kerülnek mentésre.
@biker: Amikor bekerül egy rekord a fő táblába, az az infó is mentve van vele, hogy milyen verziójú kategória tömb alapján lett kategóriákba besorolva. Így amikor ez a szkript elindul, elsőnek csak azt ellenőrzi, melyik rekordnál van más (régebbi) verzió. Így csak azokat a rekordokat nézi át, amik régi verzióval készültek. Nincs felesleges művelet.
Viszont ha aztán frissítenem kell a kategóriákhoz tartozó kulcsszavakat, akkor muszáj vagyok emelni a verziószámot is, mert nem tudhatom, melyik rekord fog új/más kategóriá(k)ba kerülni.A fenti példánál maradva:
Mondjuk azokkal a kulcsszavakkal az 1.0-s verzióban a következő kategóriákba kerülne a rekord: kultura, szorakozas, és mondjuk az "eufória" miatt a masszazs kategóriába (csak egy példa).
Aztán ezt észreveszem, hogy hopp, az "eufória" kulcsszó nem jó a masszazs kategóriába, úgyhogy kiszedem onnan.
Ekkor ha nem emelek verziót (1.0 marad), akkor az a rekord skippelve lesz, így marad a masszazs kategóriában, hibásan.
De verziót emelek (1.1 lesz), így újra ellenőrzive lesz, és kikerül a rossz kategóriából. De ennek sajnos az az ára, hogy verzióemelésnél mindet újra át kell nézetnem, mert nem tudhatom, melyik fog változni, addig, amíg nem ellenőrzöm újra. Viszont a következő változtatásig ez a szkript skippelni fogja az összeset már, mert 1.1-re át lett írva mind. -
biker
nagyúr
Elég furának tartom, hogy "ész nélkül" kapcsolatokat állítunk fel, miért nem akkor keresünk kapcsolatokat amikor kell? Ha ez valami kereső, ami kategóriák közt keres, akkor főleg.
"ész nélkül" értsd nem akkor amikor kell, nem úgy ahogy kell, és nem csak azon a rekordokon amin kell -
sztanozs
veterán
Ezt simán meg lehet csinálni SQL alapon mindenféle plusz kalkuláció nélkül is. Kellenek a következők:
- KATEGORIA tábla (ID, MEGNEVEZES)
- KULCSSZO tábla (ID, KULCS)
- M:N kötőtábla a Kulcsok és Kategóriák között (KUKA - KAT_ID, KULCS_ID)
- REKORDOK tábla (ID, ... mindenféle mezők ... )
- M:N kötőtábla a rekordok és kulcsok között (REKU - REKORD_ID, KULCS_ID)
Ezekkel simán SQL alapon lehet kimutatni a kategóriákat, mindenféle külön szenvedés nélkül:SELECT
R.*,
GROUP_CONCAT(KAT.MEGNEVEZES)
FROM REKORDOK AS R
JOIN REKU ON R.ID=REKU.REKORD_ID
JOIN KUKA ON REKU.KULCS_ID = KUKA.KULCS_ID
JOIN KATEGORIA AS KAT ON KUKA.KAT_ID = KAT.IDKb fejből, de lehet, hogy kell egy nested select:
SELECT
R.*
RK.KATEGORIAK
FROM REKORDOK JOIN
(SELECT
R.ID,
GROUP_CONCAT(KAT.MEGNEVEZES) AS KATEGORIAK
FROM REKORDOK AS R
JOIN REKU ON R.ID=REKU.REKORD_ID
JOIN KUKA ON REKU.KULCS_ID = KUKA.KULCS_ID
JOIN KATEGORIA AS KAT ON KUKA.KAT_ID = KAT.ID
GROUP BY R.ID) AS RKAT ON R.ID = RKAT.ID -
Taci
addikt
válasz
sztanozs #20883 üzenetére
Már csak rákérdezek, mert ezt a feladatot nem látom máshogy (könnyebben, főleg gyorsabban) megoldhatónak:
Adott 40 kategória. Minden kategóriában vannak kulcsszavak, van, amiben csak 20, van amiben 240, van amiben 600.
Minden rekordhoz tartoznak szintén kulcsszavak, egy, vagy akár több is.A szkript ezeket a rekordokhoz tartozó kulcsszavakat vizsgálja végig a kategóriák kulcsszavain, az összesen, és ha valamelyikben egyezés van, azt a kategóriát bejegyzi neki.
Így alakul ki a végére, hogy az adott rekord milyen kategóriákba kerül.
Aztán ezek a kategóriás kulcsszavak változhatnak, bekerül pár, kikerül pár, és ez alapján a rekordokat is módosítani kell.A 90 mp jelenleg arra elegendő, hogy ezeket az ellenőrzéseket és bejegyzéseket megcsinálja kb. átlag 1200 elemhez.
Lefuttattam 3 mp-cel, 32-re volt ideje.Ezen akárhogy nézem, gyorsítani csak úgy tudnék, ha vagy kategóriákat törölnék, vagy kulcsszavakat. Egyiket sem akarom, sőt, kulcsszavakból egészen biztosan még több lesz.
Ez amúgy csak pár egymásba ágyazott
foreach
, semmi több:-- foreach - a kategóriák listájából a kategóriák neveire
---- foreach - a kategóriák neveihez tartozó tömb elemeire, amik a kategóriák kulcsszavai
------ foreach - a rekordokhoz tartozó kulcsszavakraEzután már csak a megfelelő rekordot hozza létre, módosítja vagy törli.
Ebben a kontextusban, ezekkel a számokkal is olyan szörnyűnek hangzik? Csak mert 0 viszonyítási alapom van, nem látnám, hogy bárhol "pazarolnék", nem tudom, hogyan lehetne ezen gyorsítani.
-
pelyib
tag
Crontab tud tol-igot kezelni, tehat beallitod h x idotartamban hivja meg a skripted, nem kell tobb bejegyzes.
A scriptet meg ugy modositanam, h az elmenti az utolso feldolgozott elem IDjat vagy barmit amivel a kovetkezo futasnal meg tudja talalni a kovetkezot feldolgozando elemet.
Tehat az elso indulasnal 0rol indul, feldolgoz Y dbot majd leall, crontab inditja ujra, megnezi hogy mi volt az utolso es onnan folytatja. -
Taci
addikt
válasz
sztanozs #20883 üzenetére
*Naprendszeren kívül - nagyban gondolkodom.
Ezért is írtam, hogy ez a része nem lényeges most. Nyilván átnézem újra, mindent logolva, mi tart mégis ennyi ideig.
Előbb futtat egy lekérdezést, ahol csak a rekordhoz tartozó verziószámot ellenőrzi. Ha nem a legfrissebb (amit egy tömbből ellenőriz a legelején), akkor ezekből visszaad egy listát (id-k).
Aztán ezen a nem legfrissebb verziójú rekordokon végig futtat pár ellenőrzést, sztringekből, és JOIN-olt táblákból dolgozik, aminek a végén kap egy eredményt, és attól függően kell a JOIN-olt táblákban update-elni, törölni vagy hozzáadni (vagy mindet).Ez legutóbb 6 percig tartott 8150 rekordnál.
Ahogy a részletes logot nézem, azt látom, hogy van olyan rekord, ahol akár 4 mp-be is kerül a processz, máshol meg 1 mp-en belül megvan 2-3.
Én is szívom a fogam, mert azért tényleg nem DNS-t vizsgál a szkript... De ezt úgyis átnézem, mert ez így sok.
Lehet, itt az én gépem (tesztkörnyezet - XAMPP) teljesítménye a szűk keresztmetszet, és szolgáltatónál repülni fog.De ettől függetlenül...
...csak annak az elvére szeretnék ráérezni, hogyan lehet vajon ezt megcsinálni, ha mindenképp kezelnem kellene ezt a helyzetet (szkript futása nem fér 90 mp-be bele).
Ma reggel az jutott eszembe, hogy vajon ha a Cron job meghívja a szkriptet, aztán azt 85 mp-nél commit-olom, majd meghívatom vele rekurzívan saját magát addig, amíg végig nem megy minden elemen, akkor vajon a 2. hívás (és a többi) még a Cron job-hoz tartozik?
Ezt fogom majd kipróbálni. -
Taci
addikt
A szolgáltató 90 mp-ben maximalizálja a Cron Job-ok futási idejét.
Viszont van 1 szkriptem, aminek az összes elemen végig kell mennie néha, számolni, átírni stb. (ez a része most nem lényeges). És ez már most, 20e elem környékén sem fér bele a 90 mp-be. (duplájába se)Hogyan tudom ezt megoldani? Az oké, hogy mondjuk 85 mp-nél azt mondom, na most egy commit, aztán vége. De aztán valahogy triggerelnem kellene újra ezt a szkriptet, hogy folytassa, ahol az előbb abbahagyta. Viszont ilyenkor már a cron job le lesz állítva.
Nem állíthatok be 10-20-30 cron jobot, hátha mindre szükség van, hogy végig menjen az összes elemen.Hogyan lehet ezt megoldani?
Hátha van valalmilyen ötletetek. -
maestro87
őstag
Sziasztok!
Van ötletetek, hogy API lekérdezésnél miért kapok mindig "access-token was expired" hibaüzenetet?
Google táblázatba szeretnék API-val adatokat felvinni, de csak az access token megszerzéséig tudok eljutni. Mit csinálhatok rosszul? Nem vágom ezt a témát, de kellenének az adatok. Esetleg ha valaki privátban tudna segíteni azt megköszönném.
Azért itt kérdezem, mert talán itt van a legtöbb szakértő a témában. -
#45252096
törölt tag
válasz
sztanozs #20879 üzenetére
OOO tenyleg, de hulye vagyok, koszonom az eszrevetelt. Verebre agyuval
Az eredmenyfrissitest ugy gondoltam (befejezodottre allitast), hogy azt valami kulson apin keresztul kerdeznem le. Es ehhez ugye kell scheduler, ami minden nap tobbszor is megnezi, hogy van-e mar eredmeny, vagy esetleg elmaradt-e valami miatt a meccs. Lehet eleg lenne naponta ketszer, nem szukseges azonnali eredmeny.
Es mondjuk ejjel frissitenem a ranglistat, az alapjan, kinek hogy sikerult a tippelgetes. -
sztanozs
veterán
válasz
#45252096 #20878 üzenetére
Nem kell ehhez job szerintem, csak az adott mezőt nem kell tárolni, hanem kalkulálni - pontosabban az elkezdődött az az, ha a lekérdezés dátuma és ideje a kezdés dátuma és ideje után van. A befejeződött-et lehet kézzel állítani, mert adott meccseknél nem lehet tudni, mennyi a hosszabbítás, illetve adott esetben idő előtt is befejeződhet a meccs.
-
#45252096
törölt tag
Sziasztok,
lenne egy laraveles kerdesem.
Csinalok egy nb1es tippelos oldalt. REST apin keresztul lehet lekerni a heti meccseket.
Jelenlegi fordulot (mig nem talalok egy olyan oldalt, ahol le tudnam kerdezni a heti meccseket REST apin) manualisan vittem be az adatbazisba. Egy meccsre mindig csak meccs kezdeseig lehet fogadni. Jelenleg egy meccsnek 3 allapota van: elkezdodott, nem kezdodott el es vege.
Azt szeretnem elerni, hogy ha egy meccs elkezdodik, akkor ne lehessen ra tippet kuldeni, tehat mondjuk ha szombaton 3kor kezdodik egy Fradi meccs, akkor haromkor mar ne lehessen ra fogadni, tehat REST apin keresztul ne jelenjen meg mar az adott meccs.
Tehat szeretnek egy olyan hatterfolyamatot, ami ha eszleli, hogy egy meccs abban masodpercben elkezdodott, akkor allitsa at statuszat.
Laravel doksiban lattam, hogy vannak jobok meg task scheduler. Sok gondolkozas nelkul azt mondanam, hogy masodpercenkent lekerdeznem az adatbazist, hogy van-e olyan meccs amit mondjuk epp elkezdodik, ha igen inditson egy jobot, ami megvaltoztatja a statuszat.
Ezenkivul szeretnek kesobb olyan hatterfolyamatokat: minden nap ejjel lekeri az adott heti meccseket es ha van valtozas akkor felulirja (mondjuk elmarad vagy megvaltozott az idopont) illetve egy olyan is jo lenne, ami minden oraban megnezi, hogy vege van-e mar a meccsnek. Persze csak ha majd talalok olyan oldalt, ahonnan letudnam kerni a magyar meccseket.
Azt szeretnem kerdezni, hogy a fenti elgondolas mennyire jo ? Szeretnek egy teljesen automatizalt weboldalt -
Taci
addikt
Van esetleg bevált módszeretek / keretrendszeretek SQL adatbázis (táblák) biztonsági mentésére (php-alapon, hogy cron jobként futtathassam)? Elsősorban MS OneDrive-ra szeretném bizonyos rendszerességgel a kiválasztott táblák backupjait kimenteni, de ahogy olvastam, abba az irányba talán nincs annyira kiforrott megoldás, mint Google Drive-ra. De ott is van elég tárhelyem, szóval az is jó lenne.
Tudtok valami bevált megoldást ajánlani?
-
Taci
addikt
Ezzel a kódolásos dologgal valami nincs rendben nálam, kérnék egy kis segítséget.
Adott egy saját függvény, hogy szépen logoltatni tudjak. A lényegi része:
error_log($message_to_log, 3, $log_file_custom_path);
(vagy jobb lenne simán csak file_put_contents használatával a fájlba írogatni?)A .log fájlok, ahova mennek az adatok UTF-8 kódolással vannak elmentve.
De pár napja azt vettem észre, hogy egyszer csak fogja, és többet nem UTF-8-as kódolású a fájl, hanem átállítja a már tartalommal bőven feltöltött fájlt is ANSI-ra, és minden magyar ékezetes szöveg "szétesik".
Azok is, amiket előtte láttam, hogy rendben, utf8-asként, normálisan kódolva szerepeltek.
(Pl. tegnap még azt volt benne utf8-asként, hogy Találat kategóriára, ma meg már Találat kategĂłriára...)Adatbázis oldalon és kapcsolódásnál is minden szépen be van állítva (pl. $conn->set_charset("utf8mb4"); ).
Gondolom, ezért is kerül rendben minden az adatbázisba, még akkor is, ha a logban a "szétesett" verzió szerepel.Az ini_get('default_charset') azt mondja, UTF-8.
Gondolom, így a php.ini-ben nincs dolgom.Hogyan lehet ezt megoldani? Máshol nincs jele szerencsére ennek az UTF8-->ANSI váltásnak, csak a logban, de ez is zavaró, mert keresek bennük. (Plusz nem tudom, máshova bekavar-e.)
Szívesen vennék valamilyen hasznos tanácsot, hogy mit kell még beállítani, vagy hogy hogyan kaphatom el, mi csinálja ezt az utf8-->ansi cserét.
Köszönöm. -
Taci
addikt
UTF-8-ban van minden, és direkt úgy csináltam meg, hogy amit nem abban kapok, először azt is átalakítom azzá. Amúgy azóta minden más linknél jól működik (normálisan adták meg, normál ékezetekkel -amiben épp van-, szóval az egy egyszeri "valaminek" tűnik csak), plusz módosítottam is a függvényen:
1. FILTER_VALIDATE_URL-rel teszt. Ha false, akkor
2. a header-ös ellenőrzéses teszt (200 OK). Ha ezen is megbukna, akkor kuka.Plusz így átgondolva ha még 3. lépésnek bevonnám az ékezetes betűk ellenőrzését, (hogy ha az van benne, akkor jóhiszeműen átengedem, mert biztos csak amiatt nem volt jó az első 2 teszt), akkor igazából ha a link annyi lenne csak, hogy "é", azt is átengedné.
Szóval jó ez így, nem is ér további energiaráfordítást.
Köszi azért, hogy írtál.
-
Taci
addikt
Kérnék egy kis segítséget.
Olyan szinten vért izzadtam ezzel...
$str1 = "Névtelen";
$str2 = "Névtelen";
$pattern = "/á|é|í|ó|ö|ő|ú|ü|ű/i";
echo preg_match($pattern, $str1) . "<br>";
echo preg_match($pattern, $str2) . "<br>";
Az output pedig ez:
0
1
Az elsőt (str1) én gépeltem be, a másodikat egy link címéből másoltam ki ( [link] ).
Aztán kb. fél óra idegőrlő próbálgatás után (kb. annyi kellett, hogy a link részeit külön-külön megnézve megtaláljam, mi nem stimmel) megnéztem a link forrását, ahol azt láttam, hogy aNévtelen
az ott valójábanNe%CC%81vtelen
.Ezt találtam róla:
e%CC%81 (U+0065 U+0301): Combining character e + ́Még a Notepad++ is furcsán "kezeli", mert amikor kijelölném (normál é betűnek látszik), akkor elsőre csak a feléig jelöli, aztán következő lépésben (Shift + jobbra) a másik felét.
Ide be tudom most csak azt a karaktert másolni: é
És fura módon ha a sima é-re keresek, ezt is találatnak dobja. De amikor egyet visszatörlök: e lesz.Találtam egy ilyen patternt, ami "beugrik" mindenre:
/\p{L}+/u
Viszont én kifejezetten azt szeretném, hogy csak akkor adjon találatot, hogy magyar ékezetes betűk vannak benne.Amihez használnám:
Linkeket ellenőrzök vele.if (filter_var($link, FILTER_VALIDATE_URL, FILTER_NULL_ON_FAILURE))
Ez hibásnak dobja, ha ékezetes karakter van a linkben (works as designed), ezért egy újabb lépcsőben ellenőrzöm, hogy a magyar ékezetes betűk vannak-e benne, és ha igen, akkor tovább engedem.Na ez eddig működött, most ezzel a "fura ékezetes megoldással" már nem.
Hirtelen ötlettől vezérelve megnéztem a header-jét, és bár böngészőben 200-as státuszú, a get_headers által visszaadva HTTP/1.1 404 Not Found.
Hogyan lehetne ezt megoldani?
Egy másik linkben © karaktert fogott meg a szkriptem... hát legyen az ő bajuk, aki így enged ki egy linket. Bár ennél speciel 200-as a státusz a headerben, de hát akkor is.
-
-
Taci
addikt
Köszönöm a választ mindenkinek, átnézek mindent! Még biztos lesz kérdésem ezzel kapcsolatban, de most nekiülök alaposan átnézni a témakört, mert elsőre nem gondoltam, hogy ennyit kell majd ezzel (is) foglalkozni. De ahogy látom, ez a .htaccess-es dolog azért csúnyán félre is tud menni - viszont nagyon hasznos is tud lenni, szóval jobb, ha ebbe is belerázódom.
@Mr. Y:
Meg tudnád mutatni a .htaccess-ed tartalmát (akár csak az ide vonatkozó részt)? Persze csak a publikus részeket, szenzitív infók nélkül.
mobal adott már egy jó példát erre (köszönöm), szeretnék még esetleg egy másikat is látni, összehasonlítani. -
Háromféle megoldást tudok erre.
Az elsőt írták is, mindenhová egy index.html/php és az átirányít, vagy a tárhelykiszolgáló beállításai között a fő index fájl elérését megadod, mint error page. Ugyanis ebben az esetben, ha olyan url-t probálnak megnyitni a weboldaladon, amihez nem tartozik index fájl, automatikusan átugrik. Ilyen az én weboldalam is, mindkettő megoldást alkalmazom és onnan ugyan nem látsz be a háttérbe.
Harmadik lehetőség pedig, hogy aktiválsz egy lezárást. Ebben az esetben ezt fogja visszakapni a kíváncsiskodó: -
pmonitor
aktív tag
Lehet, hogy nagyon amatőr, de én úgy oldottam meg, hogy amelyik mappához nem szeretném, hogy hozzáférjenek(mármint hogy kilistázzák), abba mindbe tettem egy index.php-t. Mondjuk nálam nincsenek olyan hú de kényes adatok. Max. a letöltéseknél tudja valaki megkerülni vele azt, hogy a letöltés számához hozzáadja, ha letöltenek valamit. Tehát ha az én webhelyem ki is listázná, akkor sem lenne katasztrófa. Egyébként meg néha úgyis lejönnek érdekes file-ok is, hogy a böngészőbe Ctrl+S -> Weboldal - teljes mentése. Pl. ezt lementve lejön 3.65 Mb.
-
pelyib
tag
2 dolgot emelnek ki ebben a temaban:
- front controller pattern -> PHP-nak egy belepesi pontja van, ez pedig az web/index.php, ebbol kovetkezik, h a docroot a web/ folder, ide csak azt rakod ami publikusan el lehet erni
- tipikusan ilyesmi konyvtarstrukturad kene, h legyen [pelda]:/app_root/
/config <- konfiguracios fajlok
/bin <- ide kerul ami a teminalbol futtatsz
/src <- ide rakod a sajat kodod
/web <- a korabban mar emlitett index.php lakohelye
-
Taci
addikt
index.html van - bár gondolom ez esetben mindegy. (Azt még meg kell keresnem, hogyan kell átirányítanom - amúgy is, mert almappában vannak a fájlok, és amúgy is azt szeretném, hogy ha www.weblap.hu/index.html-t írja be, kiírva a címsorban akkor is www.weblap.hu legyen stb. De ezeket megkeresem.)
Eddig ezeket találtam:
Options -Indexes
- így már nem lehet listázni a mappákat.RewriteCond %{HTTP_REFERER} !^weblap_linkje [NC]
RewriteRule \.(gif|jpg|jpeg|png|webp|ico|
php|js|css|xml|log|txt|html)$ - [F,L]
- Ezzel pedig a fájlokhoz való direkt hozzáférés van tiltva, csak a weblapon keresztül lehet őket elérni. (ide talán a html nem kell, mert bár a lapon keresztül megnyitja ezeket a belső linkeket is, külön beírva már nem)Még valamit érdemes ide felvennem, figyelnem valamire?
-
Taci
addikt
Amikor pár hete azt kerestem, hogyan kell/lehet védeni egy PHP-alapú weboldalt, többek között szerepelt a "hide files from the browser". Több helyen is feltűnt, de igazán jó leírást még nem sikerült találnom róla.
Ez amúgy azt jelenti, hogy ezt megelőzzük?
Ami biztos, hogy a weblaphoz szükséges fájlok ne legyenek a gyökérkönyvtárban.
Plusz a .htaccess fájllal is van teendő - bár ez nem egyértelmű, hogy mit-hogyan. Ahogy láttam, a fő cél ezzel az, hogy a .php fájlokhoz hozzáférést letiltsa.Tudnátok esetleg egy megfelelő linket, jól összeszedett, alapos cikket mutatni, amit átolvashatok, hogy a jó irányba tereljen, ha lehet, példákkal kiegészítve, hogy értsem, mit-miért?
Köszönöm.
-
pelyib
tag
"1) require_once" egyertelmuen
Amugy ha nem akarod magad szivatni akkor composer es rabizod a tobbit.
Ha jol ertem amugy akkor azt irod le, h van egy A.php B.php es C.php. A es B is behuzza a C-t.
Ha A-t vagy B-t inditod akkor kapod a hibat? Ebben az esetben csak korbe neznek.
Ha legalabb PHP 7.0-t hasznalsz, akkor wrappold be az appodat egy try-catchel es debug backtracetry {
require your_file.php
} catch (Throwable $throwable) {
var_export($throwable);
} -
pmonitor
aktív tag
válasz
sztanozs #20857 üzenetére
>nem a php2/php3 korában vagyunk, hogy ezt meg lehetne csinálni.
Akkor megnyugodtam.
A contact form javítva. Köszi, hogy szóltál. Na, ilyenre gondoltam, hogy vki. esetleg figyelmeztetne vmilyen hiányosságra a .txt-vel kapcsolatban(pl. vmi. beállítási problémára). A webprogramozásban nem vagyok otthon. Magyarul: örülök, hogy össze raktam vhogy az oldalt.
szerk.: egyébként a contact oldalon kinn van az e-mail címem is.
-
pmonitor
aktív tag
válasz
sztanozs #20855 üzenetére
A webhelyszolgáltatómnak nem tudom az álláspontját, de valszeg. nem. Mondjuk nem úgy gondoltam az engedélyt, hogy feltörik a webhely szolgáltatómat, vagy az én jelszavamat. Mert azt tudom, hogy a dróton el lehet kapni. Végül is így mindenhez hozzá lehet férni. Csak konkrétan ehhez az egy file-hoz másik szerverről. Amiről szó volt.
Ez ellen lehet, hogy a szolgáltatóm sem tiltakozna. -
pmonitor
aktív tag
Ez érdekes kérdés. Erről jutott eszembe, hogy valaki meg tudná mondani, hogy mit tartalmaz ez a .txt file? És tudná módosítani a tartalmát? Ez az én webhelyemen van, és engedélyt adok a próbálkozásra.
-
Taci
addikt
Jó pár cron job-om ugyanazt a php fájlt használja (jelenleg require-rel). Függvényt ugye nem lehet újra deklarálni, ezért hogy ne legyen PHP Fatal error: Cannot redeclare fuggvenynev(), néztem, mi lenne a legjobb megoldás.
1) require_once
2) require és if (!function_exists('fuggvenynev'))A leírás szerint egyértelmű, hogy a
require_once
pont erre van kitalálva:
The require_once expression is identical to require except PHP will check if the file has already been included, and if so, not include (require) it again.De inkább rákérdezek, hogy tényleg ez-e a jó megoldás.
Csak mert ez olyan fura nekem. Én úgy értelmeztem (lehet, rosszul), hogy a require(_once) az kvázi olyan, mintha a behúzott fájl tartalma a behúzott helyre lenne másolva.
De mint ilyen, nem lenne szabad hogy látszódjon másik fájl futásából. Tehát ha én 10szer húzom be ugyanazt a fájlt 10 különböző kódba, és ezek egyszerre futnak, ezek nem kéne hogy "lássák egymást", így a "Cannot redeclare" hiba sem állhatna fent.
Viszont mégis adott, így gondolom, talán memóriában tárolásról lehet szó, és ott ellenőrzi, hogy az adott függvény deklarálva van-e. (De akkor pedig az csak addig él, amíg az eredetileg hívó szkript fut. Ha befejezte a futását, akkor törlődik a memóriából. Mi van akkor, ha közben egy másik szkript épp használná valamelyik függvényt az első require_once-ból, de mivel az a másodiknak már nem engedte a require-et, viszont időközben kilépett, mi történik ekkor? Logikus az lenne, ha látja, hogy volt másik require_once, amit elutasított, de az azt hívó még fut, addig a memóriában tartja neki.)Kusza ez nekem, ezért kérnék tanácsot, hogy végülis melyik a jobb, az 1) vagy a 2)?
Köszi.
-
Mike
veterán
Ne kövezzetek meg, total dump kérdés, de a következőbe futottam bele
adott egy url, akarmi.php, ha rosszul paraméterezed, 400-as hibát ad vissza és kiír egy szöveget.
- ha ezt szimplán beírom a böngészőbe, akkor kiirja a szöveget
- ha ugyanezt object-ben teszem, nem jelenik meg semmia cél az lenne , hogy ott is kiirja
van erre valami egyszerű megoldás, azon felül hogy az egészet átteszem ajaxba, és nem adok vissza egész oldalakat? (tudom, de ez most ilyen, ha nem muszáj nem alakítanám át.) -
Sziasztok!
Adott egy elméleti kérdés.
Van A) Webszerver és van B) Webszerver. A kettő független egymástól.
Tegyük fel, A) Webszerveren van egydocument.txt
fájl. Ezt a fájlt egy, az A) Webszerveren futó PHP kód módosítgatja. A kérdés az, hogy ha van B) Webszerveren is egy olyan futó PHP kódsor, melyA)Webszerver/document.txt
eléréssel rendelkezik, van-e tényleges hozzáférése ehhez a fájlhoz?Ugyanis felmerült bennem egy kérdés, miszerint ha ezen leírásra a válasz helyeslő, akkor lényegében egyetlen Webhely sincsen biztonságban...
-
Taci
addikt
$slash_character_array = array(
"%2F",
"/",
"/",
"/",
"/",
"/",
"/",
"/",
"/",
"/",
"/",
"/",
"/",
"\x2f",
"\u002f"
);
foreach ($slash_character_array as $slash) {
if (stripos($dataToCheck, $slash) !== FALSE){
//kezelés
}
}
Ha
$dataToCheck = "https://mobilarena.hu/tema/php_kerdesek_2/friss.html";
akkor erre is találatot ad, és nem értem, miért.És amikor logoltatom, hogy mégis mire talált rá, azt mondja, hogy a
/
karakterre.Ennek mi az oka? Nincs benne a
/
karakter ebben a formájában. Mégis miért talál rá? Van tippetek esetleg? Valamiért automatikus átalakítja? Ha igen, melyiket, miért? -
supercow
őstag
-
-
supercow
őstag
Régi cégnél ahol dolgoztam a főnök ilyen változóneveket használt, de nem lehetett szólni miatta:
cucc
cucc1
cucc11
cucc12
cucc111122
cuccom( + tetszőleges számkombináció)
lof*sz( + tetszőleges számkombináció)Ebből aztán persze voltak viccesek, pl
cucc112 = (lof*sz11 + cucc111) / cucc2
Aztán ha valakinek 1 hónap múlva kellett vele dolgoznia...
Akkoriban persze nem volt IDE meg refaktor meg ilyen úri huncutságok.
-
Köszönöm szépen a válaszokat!
Tehát lényegében ugyan az, mint amit én használok, csak másképpen leírva
-
Taci
addikt
Egy példán keresztül könnyebben átlátható:
$_ = array("Notes"=>"35", "Dont"=>"37", "Lie"=>"43");
echo $_['Notes'];
Az output pedig az lesz, hogy:
35
pelyib pedig leírta, hogy mi-miért:
_
--> valid változónév,['Notes']
--> asszociatív tömb Notes nevű eleme,$_['Notes']
--> Az "aláhúzás nevű" asszociatív tömb Notes nevű elemének értéke. -
pelyib
tag
Marmint mi nem lattal meg?
Associative array-t vagy az underscoret?variable name
A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores.associative array
Syntax "index => values", separated by commas, define index and values. index may be of type string or integer.Az egyik egy string ($example), a masik egy array ($_).
-
-
Taci
addikt
Illetve alig hogy megírtam a hozzászólást, rátaláltam még a "Double Encoding" kifejezésre, és azzal erre a példára is (pontosabban előbb a példára, aztán a kifejezésre):
%253Cscript%253Ealert('XSS')%253C%252Fscript%253E
Úgyhogy ezt lekezelendő az 0. és az 1. lépés közé még beleraktam egy sztring cserét,%25
-ről%
-ra, és még beleírtam pluszban, hogy ne csak a < karaktert kódolásait alakítsa vissza, hanem a>
és a/
karaktereket is.
Így a fenti sztringből a feldolgozás végén (a dirty content check előtt) ez lesz:<script>alert('XSS')</script>
-
Taci
addikt
Amit terveztem, és ami idő közben még képbe került az XSS elleni védelemben, azzal nagyjából készen vagyok (ezer köszönet a sok segítségért, sztanozs!), összeállt a függvény.
Ki szeretném kérni a véleményeteket, hogy van-e még esetleg valami aspektus, amit nem vizsgálok, és kellene / jó lenne / megérné.
A témában az utóbbi napokban/hetekben átolvasott cikkek, átnézett YT-videók alapján összeszedtem egy példa listát, hogy mik ellen kell leggyakrabban védekezni, milyen támadások/próbálkozások érhetnek. Ezt kiegészítettem még ebből a listából azokkal, amiket úgy láttam, korábban még csak hasonlót sem próbáltam: XSS Vectors Cheat Sheet.
Jelenleg csak keresőmezőben van user inputom, azt első körben kliens oldalon validálom, de persze megkerülhető, szóval azt a kérelmet ezen is végig ellenőriztetem.
Ezen kívül RSS-ekből érkező következő 3 típusú tartalmat vizsgálok vele:
- title (cím)
- description (rövid leírás)
- link (weblap és kép)Így néz ki a függvény, lépésről lépésre:
0. lépés (a függvény hívása előtt):
html_entity_decode
($abc, ENT_QUOTES);1. Ha van találat a
&#
párosra, akkor preg_replace használatával kiegészíteni az esetlegesen hiányzó pontosvesszőt (by sztanozs)
2. Pár példában az unicode kódolással kapcsolatban is találatot, így vizsgálom azu+
és\u
találatokat. Ha van találat, mb_convert_encoding segítségével dekódolás.
3. Rákeresek a<
karakter összes lehetséges formájára, és ha megtalálta,<
-re cseréli.
4. Ha linket ellenőriz, rákeres pár előre beállított, nem linkbe illő karakterre, pl.( ) \ ; , < > { } @ $
aztán még a különböző féle aposztrófokra és idézőjelekre is.' " ‘ ’ ” “
. Itt csak logbejegyzést csinálok egyelőre, hogy vizsgáljam, hogyan működik. Ha a megfelelő találatokat ez is jól szűri, akkor már ez is átbillentheti az xss_found-kapcsolót.
5. Aztán ezeket a nem normál idézőjeleket és aposztrófokat a "normál" változatukra cseréltetem.
6. Ugyanígy a\n
-t és\r
-t (és máshogy kódolt változatukat is) is lecserélem, de üres sztringre. Ugyanígy a&Tab
-ot és a null karaktert is\0
.
7. Ezek után van egy nagyon hosszú lista, amiben a "dirty content" van listázva. Ezekre a kifejezésekre keresek, és ha bármelyikre találat van, átbillent egy változóértéket, és az adott komplett bejegyzés skippelve lesz. A listában az összes HTML tag benne van, illetve az összes event handler is (pl. onError). Plusz persze a "javascript", "script", "noscript" stb. stb sztringek is. Az összes, amit a példákon keresztül támadhatónak láttam, és amiknek semmi helyük se egy linkben, se egy normál szövegben (cím, leírás). (Ha mégis fals pozitív találat lenne, majd külön kezelem.)
8. Ha linket vizsgál, és nincs dirty content-re találat, akkor a biztonság kedvéért megvizsgálom mégfilter_var
segítségével (FILTER_VALIDATE_URL).Ez a függvény tartalma. Ezután a korábban már megírt és használt processzek vannak, ahol még a linkkel kapcsolatban fontos, hogy ha a protokol csak
http
, akkor kiegészítihttps
-re, ellenőrzi, hogy valid-e, és ha igen, https-ként tárolja, amúgy skippeli.Ami átment minden szűrőn, az így lesz (_decode-dal) tárolva. Megjelenítésre pedig minden esetben minden érték
htmlspecialchars
($xyz, ENT_QUOTES); használatával lesz átadva.Lehet, erősen overkill, de az is lehet, hogy hiányzik még valami, amit nem vettem észre, hogy figyelni kellene. Lehet, soha senki nem fog "megtámadni", de jobb félni és felkészülni.
Van esetleg még valami, amire figyelnem kellene?
Köszönöm. -
Sziasztok!
Egy nyelvi PHP fájlban találkoztam az alábbi mintát követő kódsorral:
$_['Notes'] = 'Megjegyzések';
Én korábban nem láttam még ilyet, ezt hogyan lehet használni?
-
válasz
emre33 #20828 üzenetére
Szia!
Én a domain átirányítást az alábbi módon csináltam meg annó a régi Weboldalamról az újra, egy egyszerű JS-el (a példa kedvéért 1:1-ben mutatom, tehát nem reklámozás a célom):
<!DOCTYPE html>
<html>
<head>
<script>
function myFunction() {
location.replace("https://manedvaper.hu");
}
</script>
</head>
<body onload="myFunction()">
</body>
</html>Ez volt a régi Weboldal Index fájljába. A felhasználó még csak észre sem vette, olyan gyors az átirányítás.
Konkrétan azt tudom javasolni, mint egyetlen jelenleg eszembe jutó ötlet, hogy minden régi domain alcím index fájljába ezt kell beletenni, a megfelelő helyre navigálással. -
emre33
addikt
Sziasztok!
Nem PHP, de nem találtam jobb témát, hátha tudok nekem segíteni:
Htaccess segítségével szeretnék egy egyedi átirányítási szabályt létrehozni.
Szerverhez nem férek hozzá, csak htaccess jöhet szóba.1 darab www root kezel 2 domain címet.
Amit szeretnék:1: Átírányítás a valami.domain1.hu* címről a valami2.domain2.hu* címre.
Kivéve a 2. pontot
2. Ha a kérés a valami.domain1.hu\alma\ címre érkezik, akkor az a valami2.domain2.hu\korete\ címre dobja át.Első pont egyszerű, az működik is, de hogy ide hogy lehetne a kivétel szabályt beleírni, azt már nem megy.
kösz a segítséget! -
sztanozs
veterán
De itt a tökéletes regex, amiben jó a negative-backtest is:
\(&#(?:X[0-9a-f]+|\d*)(?![^&]*;))\i
itt a kód:
http://sandbox.onlinephpfunctions.com/code/ac08ec9ed305bfa1d881ddbaec58f8b58ab35cc8 -
Taci
addikt
válasz
sztanozs #20817 üzenetére
A regex (a minta) mégsem tökéletes még.
Ránéznél erre a példára, kérlek? Remélhetőleg neked hátha hamar szemet szúr, mi lehet a hiba.[link] (Csak két helyen kell a kommentelést
//
leszedni/beírni.)Adott a
–
(hosszabb kötőjel) karakter, aminek a kódja:–
.1. változat:
- Ha nincs a végén pontosvessző, és a te kódodat ({1-9}{0-9}*
) használom, nem rakja végére a pontosvesszőt. (helytelen)
- Az "enyém" ([0-9]*
) igen. (helyes)2. változat:
- Ha van pontosvessző, és a te kódodat használom, akkor nem bántja, marad minden jó a formában, és a végén a _decode átalakítja a megfelelő hosszú kötőjelre. (helyes)
- Az "enyém" viszont ezt csinálja belőle:̵1;
, a 3. számjegy után berak egy pontosvesszőt. És nem értem, miért. (helytelen)És a
{ }
és[ ]
közötti különbségre sem tudtam még rájönni. Te az előbbivel írod, én azt a formát viszont csak a számosságnál találtam meg, az általad használt formában nem:
n{x,y} Matches any string that contains a sequence of X to Y n'sRá tudnál nézni erre, kérlek?
-
Taci
addikt
válasz
sztanozs #20820 üzenetére
Asztali legfrissebb Chrome-ban, Firefox-ban és Operában is néztem, ugyanaz mindenhol. Ami fura, \-rel írva (pl. \047 az aposztróf) már jól fordítja.
megszünteted az injection lehetőségét
Pontosan hogyan? Hisz' eddig csak megkönnyítettem a dolgát azzal, hogy nem a böngészőnek kell dekódolnia, nem?Mármint itt van példának ez:
$link = "jAvAsCriPT:alert(\047Hacked!')";
A regexet használva, majd dekódolva a böngészőnek már semmi dolga nincs, mert egyből ezt kapja:jAvAsCriPT:alert('Hacked!')
Ez hogy szüntette meg az injection lehetőségét?
Mert eredetileg azért akartam ezt csinálni, hogy megtalálhassam a potenciálisan veszélyes kifejezéseket (javascript, script, onerror stb stb stb - nagyon hosszú lista, de talán megéri), amiknek amúgy semmi keresnivalójuk nincs egy linkben - aztán vagy csak ezeket a talált "rossz" kifejezéseket törölni, vagy az egész linket skippelni. (valószínűleg ez utóbbi)
De ha csak a decode --> regex --> decode lépéseket csinálom, az hogyan szünteti meg a támadási felületet?
-
sztanozs
veterán
Elméletileg a #&0 az oct kódolás lenne, de ezek szerint nem jól van implementálva abban a böngészőben, amit használsz. akkor csak simán kel kell venni az oct részt és hagyni, hogy decimálisba kódolja át és a kódodat használni. Így is - úgy is, de megszünteted az injection lehetőségét...
-
Taci
addikt
Kapkodtam, bocsánat...
A 039 az nem 8-asban (Oct) van, hisz' ott a 9-es szám benne...
De az zavar be igazán, nem nagyon látok példát rá, hogyan lenne 8-asban (Oct) leírva bármelyik karakter is.Itt van pl. ez a táblázat: [link]
A 039 azért az aposztróf, mert a 39 Dec-ben az. És valamiért a '-et őt átalakítja '-cé.
Én azt gondoltam (mert mint írtam, sajnos példát nem találtam rá), hogy ha 0-val kezdődik, akkor 8-as számrendszerbeli (Oct). És hogy az ellenőrzésed is ezért van így megcsinálva, hogy ha 0-val kezdődik, akkor már csak 0 és 7 közötti számokat vizsgálsz.
De itt van pl. a
047
. Ez ugye megfelelne a feltételnek, mert 0-val kezdődik, és utána 0 és 7 közötti számok vannak. A kódod szépen le is zárja ;-vel, a böngésző viszont/
-t ír ki, mivel a 47 a/
karakter decimális kódja. Szóval ott is a 047-et 47-ként kezeli, Dec-ként.
Viszont Oct-ban a 047 az aposztróf lenne'
.Az Oct-kódolásúakat tényleg &# kezdéssel kell meghívni? Ezért ellenőrzöd így? Tehát hogy ha
�
-val kezdődik, akkor 8-as számrendszerbeli (Oct)?És amit írtál példát sem értem már:
ϻblabla
Itt is a kódod azért rakja a pontosvesszőt a 0101 után, mert meghúztad neki a 0-7 határt (0[0-7]+). Ezért lesz e
belőle, és aze
aze
karakter, így kiírni is azt írja, hogye9blabla
Szóval ezt is a Dec-kódolásként veszi.És te azért írtad azt, hogy a kimenet
A9blabla
lesz, mert a 101 az Oct-kódja azA
karakternek.Viszont mégsem így működik. Nem lehet, hogy azért, mert a Oct-kódokat nem
&#
kezdettel kell írni? (Nem tudom, sehol nem találok példát rá.)Mert ez így most már nagyon össze-vissza számomra, és rosszul érzem magam, hogy ennyi kommentet írok, és spammelek...
.
-
Taci
addikt
válasz
sztanozs #20817 üzenetére
Pont azért írtam azt a példát az előbb, mert annál sajnos még hibázik a kódod.
De ennél így leegyszerűsítve is:$link="'";
A'
az aposztróf ('
).Ez a kimenete a kódodnál:
9
És a böngésző így jeleníti meg: [ismeretlen karakter]9Esetleg annyi változtatás kellhet, hogy
0[0-7]+
helyett0[0-7]{2,}
legyen?
Mert a 8-as számrendszerbeliek ha jól láttam, talán minimum 3 karakteresek. -
sztanozs
veterán
Igen igazából csak az számít, hova rakja a pontosvesszőt, a tiéd rossz helyre fogja, ha pl egy ilyen jön:
ϻblabla -> ϻblabla
ebből a böngésző ezt fogja értelmezni: A9;blabla
viszont a _decode nem fogja elkapni és te ezt látod: ϻblabla
vs
ϻblabla -> e9blabla
ebből a böngésző ezt fogja értelmezni: A9blabla -
Taci
addikt
válasz
sztanozs #20815 üzenetére
Köszönöm szépen!
Első lépésként _decode-ot hívni tényleg nagyon jó ötlet.Ha ehelyett:
$pattern = '/(&#(?:X[0-9a-f]+|0[0-7]+|[1-9]\d*)(?!;))/i';
így lenne:$pattern = '/(&#(?:X[0-9a-f]+|[0-9]+)(?!;))/i';
akkor miben hibázhatna? Mert így igazából a 2. feltétel le is fedhetné a 8-ast és a 10-est is.Sőt, most találtam egy példát is, amiben az első hibás eredményt ad, a második pedig jót:
$link="javascript:alert('Hacked!')";
Itt az elsővel az output (_decode előtt):
javascript:alert(9Hacked!')
A másodikkal pedig (_decode előtt):javascript:alert('Hacked!')
Persze ez lehet csak egy egyszeri "mázli", de biztos okkal csináltad úgy az elsőt, ahogy, és csak szeretném megérteni.
Köszönöm.
-
sztanozs
veterán
Igen, elírtam a regex-et több helyen...
Először a parse-olható entity-ket el kell távolítani, majd javítani, majd még egyszer eltávolítani:<?php
$link='jAvAsCript';
echo $link . "\r\n";
// parse proper entities
$link = html_entity_decode($link, ENT_QUOTES);
echo $link . "\r\n";
$pattern = '/(&#(?:X[0-9a-f]+|0[0-7]+|[1-9]\d*)(?!;))/i';
$replacement = '${1};';
// add missing semicolon
$link = preg_replace($pattern, $replacement, $link);
echo $link . "\r\n";
// parse fixed entities
$link = html_entity_decode($link, ENT_QUOTES);
echo $link . "\r\n";
?> -
Taci
addikt
És nem is úgy működik, ahogy gondolnám/szeretném, hogy működjön.
Adott pl. ez a sztring:
$link = 'jAvAsCript';
Itt a
j
ugye már eleve ;-re végződik, szóval skippelnie kellene. Ebből lenne aj
karakter.
AA
-öt zárnia kellene ;-vel, de nem teszi. Ebből lenne azA
karakter.
AA
-t jól kezelni. Szintén azA
karakter.
És aC
-t is zárni kellene ;-vel, de ezt sem teszi. Ez lenne aC
karakter.Próbáltam átírni, hogy működjön, de nem tökéletes:
$pattern = '/(&#(?:X[0-9a-f]{2,}|[0-9]{2,})(?!;))/i';
Kipróbálható verzióban: [link]Itt az a baj, hogy "beragad" két karaternél, és nem nézi, hogy zárva van-e pontosvesszővel.
Pl. aj
-nél csak

-ig veszi, mögé rak és pontosvesszőt, és kilép, mint aki jól végezte dolgát. Eredményül pedig ezt adja:[sortörés]6;AvAsCript
Szóval a két megoldás között lenne az igazság - nyilván sztanozs megoldásához sokkal közelebb.
-
Taci
addikt
válasz
sztanozs #20799 üzenetére
Mint kiderült, mégsem értem...
Ez a sor nekem elég összetett:
$pattern = '/(&#(?:X[0-9a-f]*|0{0-8}*|{1-9}{0-9}*)(?!;))/i';
Részekre szedve:
-&#
ezzel kezdődő mintákat keres
- amik így folytatódhatnak:
-X[0-9a-f]*
: tehát a következő karakter az X (a végén lévő /i miatt kis- és nagybetű is), utána pedig a 16-os (HEX) számrendszer miatt 0-9 és a-f karakterek szerepelhetnek, a * miatt 0 vagy több számban. Szóval ez a része azt hiszem, rendben (mármint értem), ezzel van lekezelve, ha Hex kódolásban lennének a karakterek.
-0{0-8}*
: Ez a rész nem teljesen tiszta. Ha jól értem, ez azt jelenti, hogy a&#
után hány darab 0 karakter állhat, és itt az van megadva, hogy 0-tól 8 db-ig akármennyi. Tehát ez alapján a minta lehetne&#
,�
,�
, ...,�
? Ezt nem értem, hogy mire való - vagy rosszul értelmezem.
-{1-9}{0-9}*
: Ezt a részt egyáltalán nem értem. Kapcsos zárójel elvileg azt jelenti, hogy az előtte álló karaktert hányszor ismételje meg. De a|
miatt a&#
van előtte. Szóval nem értem.- A végén van még a
(?!;)
. Ezt sem értem, hogy mit csinálhat.- És a legeljén lévő
?:
-ról pedig csak a nevét találtam: Non-Capturing Groups. De a működését nem bírom felfogni. Talán "csak" a művelet sebességéhez van köze?
(?: ), in contrast to ( ), is used to avoid capturing text, generally so as to have fewer back references thrown in with those you do want or to improve speed performance.-
$replacement = '${1};';
Itt pedig az $1 a backreference lenne. A kapcsos zárójeleknek itt a Non-Capturing Groups-hoz van köze? Ezt sem igazán értem. Mert ugye itt adod meg, hogy ha megtalálja a mintát, akkor mire cserélje: eredeti + zárja le pontosvesszővel.
Az én felületes "tudásommal" ha magam írtam volna, akkor ezt írtam volna:$replacement = '$1' . ';';
Miben különbözik az általad írt?Összességében a cél nyilván az, hogy felismerje, ha Dec vagy Hex kódolású karakterekről van szó (Dec:   Ẁ ♦ - Hex: ~ ˆ ∼ ), és ha nincs pontosvessző a végén, akkor egészítse ki vele.
Csak a részletekben vesztem el, és szeretném érteni, mi-mit-miért csinál. (Bocsánat, ha evidens dolgokra kérdezek rá, próbáltam megérteni a részleteket, utána járni, de ez egy számomra elég bonyolult "képlet".)
Ezt a pár dolgot pár mondatban el tudnád, magyarázni, kérlek?
-
Taci
addikt
Igen, így van. Több helyről érkezik, különböző formákban (van, ahol már eleve a forrás is escape-elt, encode-olt, össze-vissza), ezeket visszaalakítom "olvasható" formátumra, és így vannak letárolva. Ugyanígy a karakterkészlettel is, UTF-8-ra van konvertálva mind, és így van tárolva.
-
nevemfel
senior tag
Mindenképp az első opció, a következők miatt:
Kiíratásnál kontextusfüggő, hogy hogyan kell escapelni az adatot. Másképp kell escapelni, ha a string a html törzsbe kerül, másképp kell escapelni, ha egy html tag attribútum értéke kapja meg a stringet, másképp kell escapelni, ha css blokkba teszed be, és másképp kell escapelni, ha egy javascript változó kapja meg értéknek. Illetve másképp kell escapelni, ha logfileba, CSV exportfileba kerül az adat. És az általad leírt probléma miatt is (adatbázis indexelés, satöbbi.)
-
Taci
addikt
Szerintetek hogyan jobb adatbázisban tárolni az adatokat?
Adott mondjuk egy sztring, ami a forrásból idézőjellel jön, pl.:
Az almaecet "finom" és egészséges.1. opció:
Ezt tároljam így, ahogy van, majd a megjelenítésre adjam át htmlspecialchars() segítségével?2. opció:
Eleve már htmlspecialchars() használatával tároljam le? Így ez kerülne az adatbázisba:
Az almaecet "finom" és egészséges.Ez utóbbinál a keresésben látok problémát (ami persze nem megoldhatatlan), mert itt ha arra keresnek rá, hogy "quot", akkor minden idézőjelet helyettesítő html entity-re is találatot fog adni.
Így (egyelőre csak a keresés miatt) az 1. opciót tartom jobbnak, de szeretném kikérni a ti véleményeteket is. Melyik az ajánlott, bevált út? És hogy esetleg ha van még valami "jó ha tudom" dolog, azt is szívesen venném.
Köszönöm.
-
sztanozs
veterán
ha egyszer jól van kijelezve, és használva is.
Pont az a lényeg, hogy nincs jól (szabványosan) használva. Azért jelenik csak meg "helyesen", mert a böngészőmotorok direkt úgy vannak megírva, hogy a lehető legfospumpább módon összehányt html forrást is "helyesen" meg tudják jeleníteni. Ezt használják ki ezek az exploitok, és ezért kell ilyen extra lépéseket berakni az ellenőrzésekbe.
nem voltam elég gyors a válasszal...
Sőt, ae
is helyes -
disy68
aktív tag
A php html entity-ket kezelő függvényei csak a pontosvesszővel zárt karaktereket ismerik fel, mert az a szabvány.
A böngésző meg túl okos és megengedő akar lenni sok esetben és ezért fogja megjeleníteni a nem szabvány html encode-olt karaktereket is.
És igen a
A
és aA
; is az 'A' karakter csak más kódtábla szerint.
Új hozzászólás Aktív témák
Hirdetés
- Moderátort keresek a fórumhoz!
- Vezetékes FEJhallgatók
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- Counter-Strike: Global Offensive (CS:GO) / Counter-Strike 2 (CS2)
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Házimozi belépő szinten
- gban: Ingyen kellene, de tegnapra
- Háborog az Apple az iPhone-ra írt első pornóapp miatt
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Lakáshitel, lakásvásárlás
- További aktív témák...
- 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
- Eladó MacBook Pro 14" M1 Pro (2021) 16/512 99% akku Makulátlan állapotban!
- Újszeru GIGABYTE G5 - 15.6" FullHD 144Hz - i7-13620H - 48GB - 1TB - RTX 4050 - Win11 - 1,5 év gari
- Eladó garanciás,új állapotu projektorom kihasználatlanság miatt!
- ÁRGARANCIA! Épített KomPhone Ryzen 7 5800X 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! Dell Precision 5820 XL Tower PC - Xeon W-2123 112GB RAM 512GB SSD 1TB RX 580 8GB Win 11
- Azonnali készpénzes nVidia RTX 2000 sorozat videokártya felvásárlás személyesen / csomagküldéssel
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5700X 16/32/64GB RAM RX 7600XT 16GB GAMER PC termékbeszámítással
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
Állásajánlatok
Cég: PC Trade Systems Kft.
Város: Szeged
Cég: PC Trade Systems Kft.
Város: Szeged