Új hozzászólás Aktív témák
-
nevemfel
senior tag
mint írtam, paraméteres query előtt is volt élet
Persze, hogy volt élet, tele óriási security hole-okkal. Nem véletlen az, hogy az sql injection a toplista élén van a biztonsági hibák listáján. Másrészt a prepared stmt max. a PHP-ban új. Mármint amennyiben a PHP 5.0 - 5.1 újnak számít.
-
sztanozs
veterán
Mondjuk megnézem, hogy egy base64-encode-olt sztringben kogy keresel LIKE kulccsal...
Tablescan 4 president...
Amúgy nem értem ezt a JSON parát, simán lehet JSON mezőben még tagra is keresni, ráadásul még index is építhető rá (ha tudod, hogy pontosan mi alapján akarsz később keresni)... -
nevemfel
senior tag
Egyébként _minden_ query paramétert parametrizálni kell, vagy ha nincs más lehetőség (pl. az említett példádban a táblanévnél nem tudom, működik-e a dolog), akkor az adott driver escape/quote metódusával kell escapelni a változó értékét. Saját konfig változó is tartalmazhat olyan értéket, amit escapelni kell (', ", \, * satöbbi).
-
nevemfel
senior tag
Használj paraméterezhető queryket, kész passz. A query stringbe csak placeholderek kerülnek, az értékeket külön adod át, akár sqlsrv_query-t használsz, akár sqlsrv_prepare-t és sqlsrv_execute-ot, akár PDO::prepare + (opcionális bind_) + execute-ot, vagy a mysqli hasonló metódusait.
Mindenféle mágikus escape-t használni amiatt, hogy az sql injectiont elkerüld: fundamentális hiba.
-
disy68
aktív tag
"különösebben nem tolok ki magammal"
szóval minden egyes db műveletnél encode/decode? indexek, kereshetőség, performancia?
"a prepared statement/parameterized query minek a része? PDO? az 5-ös msq_query-ben volt ilyen? nem"
a prepared statement/parameterized query az adatbázis motor által támogatott mechanizmus, amit egyrészt kell támogatnia az adott nyelvhez/környezethez írt drivernek és az azt használó implementációnak
amennyiben elérhető, érdemes azt használni és nem kézzel mókolni (ez lett volna a mondandóm lényege)
-
disy68
aktív tag
"de még egyszerűbb ha az összes inputot még az sql utasításba kerülése előtt base64-gyel kódolod. akkor kb azt ír be amit akar"
nem egyszerűbb és értelme sincs, hacsak nem az a cél, hogy magaddal tolj ki
nem a PDO véd az sql injection ellen, hanem a prepared statement/parameterized query (amit persze a PDO is támogat), ami escape-eli a paramétereket és nem mellesleg a db motor ezeket előkészíti (execution plan), eltárolja és utána az adott paraméterekkel futtatja, ezáltal későbbi futáskor már csak előkapja és az új paraméterekkel futtatja (ezáltal gyorsítva a query futását)
-
Taci
addikt
mysqli_real_escape_string
Characters encoded are NUL (ASCII 0), \n, \r, \, ', ", and Control-Z.
Ezzel kiegészítve a user inputokra akkor jobb lenne?Csak mert ahogy nézem, a base64_encode-ot utána dekódolni is kell, és így gondolom, a lényege ugyanaz lenne, csak "bonyolítva" (ha nem, javíts ki, kérlek):
$str = 'This is an encoded string';
echo base64_encode($str);The above example will output:
VGhpcyBpcyBhbiBlbmNvZGVkIHN0cmluZw== -
Mike
veterán
tudomásom szerint a PDO véd az sql injection ellen. a php korábbi verziójában lévő mysql_query csak egy utasítást hajt végre, hiába, írkálsz bele pontosvesszőket. ezen felül a felhasználó inputjait szűrheted kulcsszavakra, de még egyszerűbb ha az összes inputot még az sql utasításba kerülése előtt base64-gyel kódolod. akkor kb azt ír be amit akar.
-
disy68
aktív tag
"Ha igen, miért?"
mert ugyanaz a kettő csak más drivert használnak más DB-hez és más a syntaxsqlsrv_query ugyanaz, mint a prepare + bind + execute csak egy lépésben és az SQLSRV Driver-t használja
magyarul, ha MSSQL a DB, akkor használd az sqlsrv_query függvényt
-
Taci
addikt
válasz
sztanozs #20676 üzenetére
Tehát ha a user hiába ad meg a linkelt példában lévő kártékonynak szánt inputot a $name változóhoz (a linkelt példában ez volt email címhez: bswan@microsoft.com'; DROP TABLE CustomerTable; PRINT 'Gotcha!'--), mindkét verzióval "védve vagyok"?
Ha igen, miért? (Ha 1-2 mondatban, vagy akár csak 1 magyarázó linkkel el tudnád mondani. - közben lentebb azt hiszem, meg is találtam rá a választ)
Ha jól értem, azért "kellene" az sqlsrv_query, mert:
When you execute this query using parameterized values and the same user input , only the INSERT query is executed.Viszont a Prepared Statement-tel (bind_param) is paraméterezek. Ezért lenne az a fajta verzió is "védett"?
Úgy látom, ez lehet az oka, igen ( [link] ):
A prepared statement is a parameterized and reusable SQL query which forces the developer to write the SQL command and the user-provided data separately. The SQL command is executed safely, preventing SQL Injection vulnerabilities.Köszönöm!
-
Taci
addikt
Sziasztok!
Az
sqlsrv_query
és abind_param
használata "kizárja egymást"?Eredetileg így néz ki egy lekérdezésem előkészítése (példa):
$sql = "INSERT INTO " . $table . " (id, name, date) VALUES (?,?,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("iss", $id, $name, $date);
De most, ahogy olvasgatom, hogy kell megvédeni egy PHP-alapú weboldalt, és rátaláltam az SQL Injection Attacks-re, tippnek a
sqlsrv_query
használatát látom.És ha jól látom, ez alapján a fenti példával ez így nézne ki:
$sql = "INSERT INTO " . $table . " (id, name, date) VALUES (?,?,?)";
$params = array($id, $name, $date);
$stmt = sqlsrv_query( $conn, $sql, $params);
- A bind_param az ugye akkor kell, ha gyakori a lekérdezés, mert így hatékonyabb. De akkor ezek szerint ezzel is kijátszható a kód (SQL Injection Attack)?
- Ha pedig átváltok az ajánlott sqlsrv_query-re, akkor bár védve leszek az injection-támadások ellen, de bukom a bind_param (prepared statement) általi hatékonyságot?Vagy hogy van ez? Lehet/kell ezeket "mixelni"? Vagy elég csak az egyik, hogy mindkét előnyt (hatékonyság + védelem) megtarthassam?
Köszi!
Amúgy próbáltam az itt említett példán keresztül "megtámadni" az adatbázis, de sehogy sem fogadta el a Drop Table kódrészt (saját adatbázisra szabva, persze). Szóval nem tudom kipróbálni, melyik a jó megoldás.
-
Exian
addikt
Nem hiszem. Ez biztos, hogy csak az adott weboldalnál jelentkezik, minden más weboldal a szerveremen problémamentesen megy és nincs ez a jelenség. Kliensoldalról meg szintén nincs gond, próbáltam több gépről, több hálózatból, mobilnettel, stb, mindenhonnan érzékelhető a gond.
Most annyi változás van, hogy most már ilyen hibát ír a Chrome:
"ERR_TUNNEL_CONNECTION_FAILED"
De Edge alól továbbra is hibátlanul megjelenik.
-
disy68
aktív tag
az iCalendar tartalmazhat participation infót amennyiben a kiállítója ezt belegenerálja
-
Mike
veterán
volt már valakinek dolga iCalendar bejegyzésekkel? Lehet valahonann tudni, hogy ki jelez vissza, hogy eljön? Eddig olyat találtam, hogy a google calender apija meg tudja mondani, de ahhoz kell a google fióktól engedély.
-
Ez a kép, amit kaptál, a Chrome böngésző sajátja, nem is fogod megtalálni a forráskódban. Én arra tudnék gondolni, hogy kompatibilissé tettés Edge és FireFox böngészőkkel, de Chrome-ra nem. Ez okozhat talán ilyet. Ha van esetleg lehetőséged, nézd meg Safari-n mit mutat.
-
Exian
addikt
válasz
pelyib #20665 üzenetére
Köszi!
Hát nem nagyon látok semmit, hiba nincs, egy warning van: crbug/1173575, non-JS module files deprecated.
SZERK.: mondjuk ahogy gyors utána olvastam, valakinek pont ugyanezt az ERR_CONNECTION_REFUSED hibaüzenetet dobta ugyanezzel a warninggal.
Amúgy egy pillanatra az Edge-ben is bejött egy "A lap nem jeleníthető meg" oldal, ott pont DNS problémát írt, de csak egy pillanatig volt az oldal, aztán ment tovább jól az oldal és Edge/Firefox alatt továbbra is megy jó, de Chrome-mal nem.
Nem tudok rájönni. Mondjuk egy olyan valaki csinálta, aki most végzett valamilyen tanfolyamot, tehát kezdő, de a PHP részét segített neki valaki összerakni. Én szintén nem vagyok perfekt PHP-ban, úgyhogy neki sem állok átnézni, felesleges, max. a nagyon szembetűnő hibákat veszem észre. De ez, hogy csak egy böngészőt érint és nincs semmi hibaüzenet szerveroldalról, így nagyon nehéz...
Az általam csinált weboldalak, meg amiket nem én csináltam, de az én szerveremen futnak, minden tökéletesen megy évek óta, szóval nem szerveroldali a hiba, ráadásul felraktam egy másik, otthoni szerveremre is, a helyzet azon is ugyan az, Chrome nem tudja megnyitni. De csak az.
-
Exian
addikt
Sziasztok!
Egyik ismerősöm csinált az anyukájának egy egyszerű kis bemutatkozó weboldalt a vállalkozásának tevékenségéről. PHP+SQL+JS hármas a weboldal.
Felajánlottam nekik, hogy hosztolom a saját szerveremről (Linux).
Felraktam a weboldalt, meg az SQL adatbázis is el lett készítve, minden rendben is van, ám a probléma az, hogy Chrome böngésző alatt ugyan bejön az oldal, de egy kis idő múlva (pár perc) már nem tudja megnyitni és EZEN A KÉPEN LÁTHATÓ hibaüzenetet dob. A weboldal címét kiszedtem a képről, nem lényeges, illetve ilyen formán még nem is publikus.
De pl. Edge és Firefox böngészők alatt nincs ez a jelenség, ott folyamatosan megjelenik az oldal hibátlanul, minden része úgy működik, ahogy kell.
Van valakinek tippje, hogy mi a bánat miatt hülyül meg a Chrome egy idő után és miért dobja ezt az üzenetet?
Persze tök jó, mert a szerveren semmiféle hibaüzenet nincs a weboldalhoz tartozó error logban, tehát onnan nem tudok kiindulni.
Ha átrakom a szerveren egy másik aldomainre, akkor megint egy pár percig jó, aztán ugyanazon a címen egyszer csak a linkelt hibaüzenet jön.
Hátha valaki találkozott már ilyennel és van tippje.
A szerveremen fut még vagy 10-15 másik PHP alapú weboldal és semelyikkel sincs semmilyen hiba, ilyen meg aztán főleg nincs.
Sokkal egyértelműbb lenne a dolog, ha rögtön ezt dobná és be sem jönne az oldal, de nem, először bejön és minden okésnak tűnik, csak pár perc után dobja be és onnantól többet nem nyitható meg.
Köszönöm!
-
laracroft
senior tag
Sziasztok
POST-al kapok egy textmező tartalmat, melyben van pár darab \r\n.
E-mail-ben szeretném tovább küldeni tartalmát, de nem tudom lecserélni őket -mondjuk <br>-re.
Általam talált leírások ezeket a megoldást ajánlják, de nem jön össze, ugyanúgy benne marad:
preg_replace( "/\r|\n/", "", $text);
$text = str_replace("\n", "", $text);Nem tudok rájönni mit rontok el segítsetek légyszíves
köszi -
Sziasztok!
Laravelben igencsak kezdo vagyok, igy nezzetek el nekem ha marhasagot kerdezek/irok.
Projektemet Laravel 8/Jetstream/Laratrust komboval fejlesztem, es az RBAC megvalositasa kozben akadtam meg:A CreateNewUser.php-t igy modositottam:
$user = User::create([
'username' => $input['username'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]);
$user->attachRole('visitor');
return $user;
Lathato, hogy a jogot hozzaadja. Regisztracio utan a beepitett email kuldo automatizmussal egy megerosito emailt kuldok. Amikor rakattintok az emailben levo linkre, akkor a /dashboard-ra kerulok.
Aztan itt, a Profile-ban meg kell adnom tovabbi adataimat (migration-be raktam oket).
A UpdateUserProfileInformation vonatkozo sorai:
if ($input['email'] !== $user->email &&
$user instanceof MustVerifyEmail) {
$this->updateVerifiedUser($user, $input);
} else {
if ($user->first_login === false) {
$user->forceFill([
'first_login' => true,
])->save();
}
es$user->forceFill([
'firstname' => $input['firstname'],
'middlename' => $input['middlename'],
'lastname' => $input['lastname'],
'username' => $input['username'],
'email' => $input['email'],
'landlinetel' => $input['landlinetel'],
'mobiletel' => $input['mobiletel'],
'mandatory_fields_filled' => true,
])->save();
Auth::logout();
Session::flush();
redirect(route('login'));
Elmeletileg (ill. a dokumentacio alapjan is ugy tunik, hogy ezt igy illik csinalni errefele, illetve SO-n, meg egyeb forumokon is ezt talaltam: Az auth logout kijelentkeztet, utana eldobom/lezarom a session-t, hogy ne lehessen vele visszaelni, majd atiranyitok.
LoginResponse.php:
public function toResponse($request)
{
$user = auth()->user();
if ($user->mandatory_fields_filled && $user->hasRole('admin')) {
$home = '/admin';
return redirect()->intended($home);
} elseif ($user->mandatory_fields_filled && $user->hasRole('user')) {
$home = '/user';
return redirect()->intended($home);
} elseif ($user->hasRole('visitor')) {
if ($user->mandatory_fields_filled) {
$user->detachRole('visitor');
$user->attachRole('user');
}
$home = '/dashboard';
return redirect()->intended($home);
} else {
$home = '/';
return redirect()->intended($home);
}
}
Ha atirom a user_role-ban bejelentkezes elott a felhasznalohoz tartozo jogot (mondjuk visitorrol userre) akkor a bejelentkezesnel a /userre redirectel (ami 404, mivel meg nincs kesz), am ha nyomok egy visszat a bongeszoben, akkor a korabban bejelentkezett user sessionjebe dob vissza.
Van Laravelnel erre valami szep megoldas, amivel normalisan meg lehet csinalni a bejelentkezeskori hitelesitest?
Eletem elso Laravel-es tanulo projektje ez, ugyhogy kerlek ne lojetek.
Koszi!
Udv.
-
Taci
addikt
válasz
nevemfel #20659 üzenetére
Ezt most amúgy én sem értem.
Ez működik, csak benne van pár p-tag a kinyert sztringben ($description):
$description = $node->getElementsByTagName('description')->item(0)->nodeValue;
Ezért akartam volna úgy, hogy "tovább bővítem" ezt a kódot, hogy az első p-tagek közti sztring részletet adja vissza, pl. így:
$description = $node->getElementsByTagName('description')->item(0)->nodeValue->getElementsByTagName('p')[0];
De ezt nem tudtam megoldani, mert csak vakon próbálkoztam, hogy hogyan kellene/lehetne folytatni.
Sztringvágással már megcsináltam, csak reméltem, lehet egyszerűbben/szebben is.
-
Taci
addikt
válasz
sztanozs #20655 üzenetére
De fura, teljesen meg voltam győződve róla, hogy egy sima getElementsByTagName lesz, nem gondoltam, hogy ez ennyire "lehetetlen" feladat php-ben, "szépen".
A forrás sajnos nem "megbízható", bármikor változtathatnak, ezért is szerettem volna a sztringek vágásánál egy "szebb" módot, mert ha ott változtatnak valami radikálisat (vagy akár kicsit is, de "rossz helyen"), akkor hibára futhat a kód.
De akkor maradok ennél. Köszönöm.
Neked is a választ, Mike. -
Taci
addikt
Adott egy hosszú XML fájl, abból egy részlet a következő:
<description><![CDATA[<p>Az eddig főként a rakétagyártásban jeleskedő Rocket Lab feladata az lesz, hogy két űreszközt is létrehozzon.</p> <p>The post <a href="https://ng.24.hu/tudomany/2021/06/17/maganvallalat-epithet-mars-szondakat-a-nasa-nak/" target="_blank">Magánvállalat építhet Mars-szondákat a NASA-nak</a> first appeared on <a href="https://ng.24.hu/" target="_blank">National Geographic</a>.</p>]]></description>
Magát a description-t így egyben szépen ki tudom szedni:
$description = $node->getElementsByTagName('description')->item(0)->nodeValue;
Viszont így jelenleg ezt tartalmazza ennél a példánál:
Az eddig főként a rakétagyártásban jeleskedő Rocket Lab feladata az lesz, hogy két űreszközt is létrehozzon.
The post Magánvállalat építhet Mars-szondákat a NASA-nak first appeared on National Geographic.
(Csak linkekkel, de azt most kiszedtem.)Nekem csak az első p-tagek közti rész kellene (Az eddig főként... létrehozzon.), az utána következő részek már nem.
Ezt hogyan tudom kiszedni, ugyanígy "szépen" (nem sztringekkel vágdosva)?
Tudnátok ebben segíteni?getElementsByTagName('p')
kellene valahogy valahova, csak nagyon nem találom, pedig biztosan egyszerű.Köszönöm.
-
wis
tag
-
RedHarlow
aktív tag
Sziasztok,
Tudnátok segíteni, hogy az alábbi db connect funkció, hogy néz ki helyesen oracle db esetén?
class DB {
public static $mysqli;
public static function Connect() {
DB::$mysqli = new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
DB::$mysqli->set_charset("utf8");
DB::$mysqli->query("SET NAMES 'utf8'");
}
}
DB::Connect();
Az én átiratomban az alábbi hibákat kaptam:
class DB {
public static $oci;
public static function Connect() {
DB::$oci = oci_connect(DB_USERNAME, DB_PASSWORD, DB_DATABASE);
DB::$oci->set_charset("utf8");
DB::$oci->query("SET NAMES 'utf8'");
}
}
DB::Connect();
PHP Fatal error: Uncaught Error: Call to a member function set_charset() on resource in
PHP Fatal error: Uncaught Error: Call to a member function query() on resource in -
Sziasztok!
Értetlenül állok egy sajnos egyre gyakoribb jelenség előtt.
A Weboldalamon használok két számlálót. Látogatottságot mér, az egyik az adott évre vonatkozóan, a másik összesítettet.Működése egy egyszerű PHP kód, a Webtárhelyen egy TXT fájlt olvas be, növeli egyel a számértéket és elmenti. A probléma az, hogy az utóbbi időben sajnos ez rendszeresen vagy nullázódik, vagy valami abszolút értelmetlen (de számsor) érték jelenik meg. Például 61245 az egyik nap, másnap már csak 170, vagy 11234.
Mi okozhatja ezt a problémát? Vagy megvalósítható ez a rendszer akár JS-el is? Azért csináltam annak idején PHP-val meg, mert úgy tudom, a JS nem képes fájlt olvasni, módosítani és írni. Ez így viszont roppant zavaró. Előfurdult ilyen egy-két alkalommal az elmúlt években, de az utóbbi hónapokban szinte heti rendszerességgel történik.
Előre is köszönöm a segítséget!
-
pelyib
tag
válasz
RedHarlow #20645 üzenetére
Szerintem ez teljesen valid.
majd a sart gomb connectel a db-be és futtatja az sql query-t
Marmint a start az elkuldi a mar kesz tombot a API-nak ami szepen validal, lefutattja a queryt, kikopi az eredemenyt
(Validalas + prepared statement ugye alap).Ha esetleg a query futasa kesobb sokaig tarthat:
- az elso API csak egy taskId-t ad vissza
- masik endpointot meg lehet pool-ni a taskId-val, nem szep megoldas de mukodik -
Mike
veterán
válasz
RedHarlow #20645 üzenetére
ehhez semmilyen backend nem kell.
FileReader API
https://developer.mozilla.org/en-US/docs/Web/API/FileReadermiért nem olvasok el mindent?
SQl-hez kellbeolvasod a file-t, elküldöd az id-kat a backendre, és visszakapod a csv-t
de ennyi energiával feltöltöd a file a szerverre ott kiszeded php-val az id-kat és visszaküldöd a csv-t -
RedHarlow
aktív tag
válasz
bhonti #20642 üzenetére
Nem szeretném feltölteni a fájlt a szerverre, csak olvasni szeretném. A feladat:
Minden nap kapok egy kupac ID-t. Ezekkel kell lekérnem DB-ből adatokat. Mivel nem én fogom csinálni ezt majd, hanem IT tudás nélküli kollégák így csinálok egy felületet ahova csak betallózzák mindig a kapott ID-kat és start gommbal kiköpi nekik az eredményt csv-be.
Ez az én fejemben úgy néz ki, hogy egy browse gomb (HTML), txt olvasása sorról sorra mentése egy tömbbe (JS) majd a sart gomb connectel a db-be és futtatja az sql query-t és kidobja csv-be (PHP).
Ide a fúrumba most azért írtam mert kicsit úgy érzem mintha túlbonyolítanám.
-
Taci
addikt
Nem, nem curl-lel, hanem simán csak get_headers.
-
RedHarlow
aktív tag
Sziasztok,
Szeretnék egy browse gombbal beolvasni egy a gépemen lévő txt sorait egy tömbbe, a tömb adataival pedig szeretnék egy külön gombbal elindítani egy sql-t. Az lenne a kérdésem, hogy ennek mi a szép megoldása? Javascripttel olvassuk a fájlt és átadjuk az adatokat a start gomb lenyomásánál?
Előre is köszönöm a segítséget.
-
cigam
titán
Az in_array()-nak van vmi trükkje? Mert ez nem működik:
$categories = get_the_category();
if ( ! empty( $categories ) ) {
if (in_array('Blabla',$categories)) {
...
}
else {
...
}
}
Pedig a var_dump($categories); szerint van benne Blabla:
array(2) {
[0]=> object(WP_Term)#17210 (16) {
["term_id"]=> int(48)
["name"]=> string(6) "Teszt"
["slug"]=> string(5) "teszt"
["term_group"]=> int(0)
["term_taxonomy_id"]=> int(48)
["taxonomy"]=> string(8) "category"
["description"]=> string(1) "A"
["parent"]=> int(0)
["count"]=> int(11900)
["filter"]=> string(3) "raw"
["cat_ID"]=> int(48)
["category_count"]=> int(11900)
["category_description"]=> string(1) "A"
["cat_name"]=> string(6) "Teszt"
["category_nicename"]=> string(5) "teszt"
["category_parent"]=> int(0)
}
[1]=> object(WP_Term)#17465 (16) {
["term_id"]=> int(5906)
["name"]=> string(6) "Blabla"
["slug"]=> string(6) "blabla"
["term_group"]=> int(0)
["term_taxonomy_id"]=> int(5906)
["taxonomy"]=> string(8) "category"
["description"]=> string(0) ""
["parent"]=> int(0)
["count"]=> int(4)
["filter"]=> string(3) "raw"
["cat_ID"]=> int(5906)
["category_count"]=> int(4)
["category_description"]=> string(0) ""
["cat_name"]=> string(6) "Blabla"
["category_nicename"]=> string(6) "blabla"
["category_parent"]=> int(0)
}
}
Valamit rosszul csinálok, de mit? -
Taci
addikt
válasz
sztanozs #20634 üzenetére
Igazából én jelenleg a 200-at, a 301 és 302-t kezelem.
Az összes többit szeretném csak simán a logomba összeszedni, hogy ha olyan link kerül elő, amit máshogy kell kezelni, tudjam, hogy arra mit dobott - plusz a php error logot szeretném tisztán tartani, mert ha ott van bejegyzés, akkor azzal foglalkoznom kell.
Egy HTTP status code-dal vagy DNS hibával nem (kapott linkek, nincs ráhatásom, se a szerverjeik állapotára).Elképzelhető, hogy nem működő linket kapok, vagy a szerverrel van valami, és nincs header (így a
get_headers
hibára fut, ami így a php error logba kerül), de ezt a lehetőséget is szeretném lekezelni, hogy a saját logomba kerüljön.Hogyan tudnám megoldani?
Köszi. -
-
Taci
addikt
Hogyan tudnám "elkapni" a saját kódomban, ha egy oldal nem elérhető?
Adott pl. ezt a teszt oldal direkt erre a célra:
http://404.php.net/Az alap link-elérhetőséget tesztelő funkcióban a header-ből nyerek ki információt:
get_headers($url);
Ennél a linknél viszont ugye nincs header, így ez hibára fut, és a php error logjába ír:
get_headers(http://404.php.net/): failed to open stream: php_network_getaddresses: getaddrinfo failed: Nincs ilyen ismert állomás.Hogyan tudnám ezt a saját kódomban "elkapni", hogy ne kerüljön a php error logjába mint hiba, hanem csak számomra a saját logomban jelenjen meg, mint információ?
-
Taci
addikt
-
-
Taci
addikt
válasz
sztanozs #20628 üzenetére
Igen, erre jutottam én is. Még próbálom ezt meghegeszteni, mert sokkal kényelmesebb és menedzselhetőbb lenne, ha lenne 1 feldolgozó szkriptem, és azt hívná meg minden forrás - de hát már látom, hogy a vége az lesz, hogy mindegyik kap egy saját, testre szabott szkriptet, mert azzal, hogy kezelek egy nem standard-ként működőt, esélyes, hogy elrontom a többit (ahogy most is történik), amik meg amúgy tökéletesen, a standardok szerint működnek.
Köszi.
-
sztanozs
veterán
Amennyiben a 23-féle forrás 24 féle képen állítja elő a dolgokat, úgy célszerű bevezeti egy abszrakciós szintet és írni minden forásra egy-egy feldolgozót az absztrakciós szint (illetve néhány kulcs-feldolgozó-függvény) újrafelhasználásával. Persze meg lehet oldani egyetlen giga-feldolgozóval is, de ebben az esetben, ha bármelyik forrás változik, akkor a feldolgó fércelése kihatással lehet más (nem érintett) forrás rutinjának a szétesésével.
-
Taci
addikt
Beleraktam hibakezelést, ahogy írtad:
if (curl_errno($ch)) {
$error_msg = curl_error($ch);
echo "ERROR: " . $error_msg;
}
Így viszont minden linknél ezt írja ki:ERROR: <url> malformed
De passz, hogy miért, minden url rendben van - legalábbis 100%, hogy ha van is hibás közte, nem mind az.
Ja, és amúgy meg gond nélkül dolgozik a linkek tartalmával.
Szóval így nem sokat ér ez a hibajelzés. -
Taci
addikt
válasz
sztanozs #20625 üzenetére
Nincs itt nagy baj, se tervezési hiba. (@polymorphin) Sok helyen van meghívva már a függvény, el akartam kerülni, hogy mindenhol át kelljen írni a paraméterezés miatt.
De ha aglobal
kerülendő (mi miatt amúgy?), akkor inkább átírom.@SUPREME7: Írtam is, hogy a global-lal próbáltam, de valamiért az egyik függvénynél/értéknél nem volt hajlandó működni. De mindegy is, nem is javasolt, meg inkább megcsinálom az átírást.
Köszi.
Amúgy az bonyolítja be nagyon nálam, hogy 23 db külső forrásból kell dolgoznom, és 24 féle képpen kezelik a dolgokat, amit nekem egy szkriptben kell lekezelni, és ez néha kuszává teszi.
Most a legtöbb probléma a következő miatt jött fel:
Írtam korábban, hogy ellenőriznem kellett, hogy valid linkekkel dolgozom-e. Ott ugye jött az átirányítás "problémája". Megoldottam.
De aztán jött az, hogycurl
-lel (is) kell dolgoznom ezeknek a linkeknek a tartalmán. És most pont az átirányítós probléma miatt jött fel egy újabb:
"failed to open stream: Redirection limit reached, aborting"Kiszedtem hát a header-ből a "Location" alól (persze ettől bonyolultabban), mert ugye így megvan a végső cím, és akkor nem lesz ilyen átirányítós probléma.
De aztán jött egy olyan forrás, ahol nemes egyszerűséggel a "Location"-be (már ha épp így írják, és nem csupa kisbetűvel) már nem a teljes átirányított linket rakják be (mert hát ugye miért is lenne egységes), csak a domain utáni részt. Pl. ha a domain https://www.oldal.hu/, és a "Location"-be csak annyi kerül, hogy "/aloldal/cikk.html".És ez mind abba a funkcióba kellett hogy kerüljön, aminek csak annyi dolga lett volna eredetileg, hogy valid-e a link vagy sem.
Na az ilyenek teszik egyre bonyolultabbá és kuszábbá a szkriptet. -
-
SUPREME7
őstag
$szoveg = "almafa";
function fuggveny1(){
global $szoveg;
echo $szoveg;
} -
Taci
addikt
Talán így átláthatóbb és egyszerűbb a kérdésem:
$szoveg = "almafa";
function fuggveny1(){
echo $szoveg;
}
function fuggveny2(){
fuggveny1();
}
Hogyan tudom eljuttatni a $szoveg változó tartalmát (paraméterek használata nélkül) a fuggveny1-be, miközben azt előbb a fuggveny2-nek kell meghívnia, csak azon keresztül fut le?
-
Taci
addikt
Segítséget kérnék a következő témában:
így néz ki kb. az egyik php fájl tartalma:
$valtozo1 = "érték";
function fuggveny1($valtozo, "string"){
// dolgozzon a $valtozo-val és a string-gel
}
fuggveny1($valtozo1, "szöveg1");
Eddig minden oké.
Aztán ezután jön pár dolog, amivel nem boldogulok. Újabb függvények, amiben ezt a függvényt hívnám meg újra. Viszont paraméternek nem adhatom át.function fuggveny2(){
fuggveny1($valtozo1, "szöveg2");
fuggveny3();
}
És itt fontos, hogy a $valtozo1 az fix. Viszont nem viszi át az értékét a függvényen belülre.
Próbáltam global kulcsszóval, valamiért azzal sem:function fuggveny2(){
global $valtozo1;
fuggveny1($valtozo1, "szöveg2");
fuggveny3();
}
Aztán sajnos még tovább bonyolódott a dolog, mert jött egy másik függvény, amiben ez az előző van benne, így már duplán nem tudom, hogyan tudnám olyan "mélyre" (2 függvény mélységébe) bevinni a változót:
function fuggveny3(){
fuggveny1($valtozo1, "szöveg2");
}
Hogyan kell ezt megoldani, ha paraméternek nem adhatom át?
Hogyan tudok "külső" (függvényen kívüli) értékeket függvényen belül használni, akármilyen mélységben?A 3. függvényt a 2. hívja. Ha én használni akarok egy változót a 3. függvényben, ami teljesen kint van definiálva, akkor azt előbb be kell vinnem a 2. függvénybe, hogy aztán bevihessem a 3.-ba?
Nagyon nem értem ezt.
Köszönöm, ha el tudjátok magyarázni.
-
pelyib
tag
válasz
zapikanka #20618 üzenetére
Docker container + env valtozo
Vagy csak siman letrehozol egy credential.php-t.
Ezt a filet hozzaadod a gitignor-hoz, h veletlenul se commitold.
Ahol meg kell ott is_readableupdate: "h ne lassa mas" azt csak masodik olvasara lattam. Ez igy eleg para. Ilyenre ugranak az ITsec kollegak minden cegnel. Mar az aggalyos h plaintext-ben van a jelszo, de megfejeled meg azzal, h megosztott helyre fel is toltod.
Esetleg meg lehet nezni, h nincs e valami token / key alapu auth a hasznalni kivant servicenek.
-
zapikanka
tag
Sziasztok,
curl-al szeretnék elérni egy webservice-t és ehhez kétszer is authentikálnom kell a vállalati hálózat miatt. Ehhez a saját felhasználónevemet használom, de nem szeretném kódban tárolni se a usernevem se a jelszavam. Tudok esetleg valami megoldást erre, hogy a lenti kódban hogyan tudnám úgy tárolni ezeket, hogy aki a szerveren megnyitja ezt a php file-t az ne lássa egyből a user/pw párosomat?
$ch = curl_init();
$service_url = "https://google.com";
$user = "user";
$pw = "PW";
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$pw);
$proxy_url = "proxyURL";
$proxy = true;
if ($proxy) {
curl_setopt($ch, CURLOPT_PROXY, $proxy_url);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user.':'.$pw);
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
}
curl_setopt($ch, CURLOPT_URL, $service_url);
curl_exec($ch);
curl_close ($ch); -
Mike
veterán
azért egy kis erro kezelés nem árt
$result = curl_exec($ch);
$result_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($errno = curl_errno($ch)) {
valami
}
curl_close ($ch);
én még tettem bele egy kis json átalakítést is, úgyis mindig abban jön vissza a válasz (kivéve a Gyevi bírót)
$res = array("result" => json_decode($result, true), "result_code" => $result_code);
return $res;
-
Taci
addikt
válasz
disy68 #20612 üzenetére
Sajnos ezzel sem működött (de köszönöm azért). Végül így sikerült megoldanom:
function file_get_contents_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
(Egy 100. oldalon lévő Google-találatban leltem.)
-
Mike
veterán
van itt olyan aki már fejlesztett appot? miben gondolkodjak? React? vagy van helyette vmi generátor ami kényelmesebb, gyorsabb (oké korlátozottabb) olyan mint mondjuk a webes tartalomra a Wordpress?
-
Taci
addikt
válasz
pelyib #20579 üzenetére
Sajnos nem igazán jutok előrébb vele, egyszerűen akárhány Google-találatot próbáltam végig a témára, nem tudtam használható eredményt produkálni.
Adott pl. ez a link:
https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje/A forrásából kellene nekem mondjuk a charset:
<meta charset="UTF-8">
Vagy egy kép linkje:<meta property="og:image" content="https://www.szeretlekmagyarorszag.hu/wp-content/uploads/2020/12/CSP_6335-másolat.jpg"/>
1)
Hogyan kell ezt kiszedni? (getElementsByTagName
-mel pl. Mert sztringként megvan, de az "nem szép megoldás")2)
Mivel az összes soron amúgy is végig megyek:$all_lines = file($feed_link);
foreach ($all_lines as $line_num => $line) {
//
}
Esetleg fel lehet ezt használni agetElementsByTagName
-mel (vagyByID
, vagy bármi, ami kell) kombinálva? Az sem baj, ha nem, csak ha már úgyis végigmegy minden soron, hátha.Köszönöm.
@bhonti: Köszönöm, igen, végül számomra is ez lett a konklúzió.
-
Taci
addikt
DOMDocument::load(): Extra content at the end of the document in xml_linkje, line: 1
Túl lett bonyolítva. Csak ezt a hibabejegyzést szeretném kezelni. Fogalmam sincs, mi okozta, valószínűleg "elírtak valamit" az xml-ben. (?) Innen jött az ellenőrzés ötlete, és onnan pedig minden más.De csak ezt szeretném kezelni, ha baj van az xml-el, akkor a foreach-ben kapjon egy continue-t (hibás fájllal ne dolgozzon), aztán majd javítják, a szkript meg pár perc múlva újra próbálja úgyis.
Ennek az 1 hibabejegyzésnek a kezeléséhez kérnek segítséget.
-
Taci
addikt
Na jó, ezt nem értem.
Csináltam egy eléggé overkill funkciót az ellenőrzésre:
function testIfValidURL($url){
$headers=get_headers($url, 1);
$url_valid_state = "";
if (stripos($headers[0],"200 OK")){
//URL Valid
echo "URL is Valid (200 OK): " . $url . "<br>";
$url_valid_state = TRUE;
return TRUE;
//exit();
} else if (stripos($headers[0],"301") || stripos($headers[0],"302")){
//URL Redirected (301 or 302)
echo "URL Redirected (301 or 302): " . $headers[0] . ". Checking Location link.<br>";
if (array_key_exists('Location', $headers)){
if (is_array($headers['Location'])){
//Array
echo "Headers Location type is array.<br>";
$location_count = count($headers['Location']);
echo "location_count: " . $location_count . "<br>";
$url_valid_state_check = 0;
foreach ($headers['Location'] as $headers_location_value){
echo "Checking headers_location_value: " . $headers_location_value . "<br>";
if(testIfValidURL($headers_location_value)){
$url_valid_state_check++;
return TRUE;
//exit();
}
}
echo "url_valid_state_check: " . $url_valid_state_check . "<br>";
if ($url_valid_state_check > 0){
$url_valid_state = TRUE;
} else {
$url_valid_state = FALSE;
}
} else if (is_string($headers['Location'])){
echo "Headers Location type is string. Checking.<br>";
if(testIfValidURL($headers['Location'])){
$url_valid_state = TRUE;
}
}
} else {
echo "URL header doesn't include Location. Setting URL valid state to FALSE.";
$url_valid_state = FALSE;
}
} else {
echo "URL status code is unknown: " . $headers[0] . ". Setting URL valid state to FALSE.";
$url_valid_state = FALSE;
}
return $url_valid_state;
}
Az eredeti linkkel próbáltam:
https://www.szeretlekmagyarorszag.hu/ime-a-tokeletes-toltott-kaposzta-receptje/A kimenet:
URL Redirected (301 or 302): HTTP/1.1 301 Moved Permanently. Checking Location link.
Headers Location type is array.
location_count: 2
Checking headers_location_value: https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje
URL Redirected (301 or 302): HTTP/1.1 301 Moved Permanently. Checking Location link.
Headers Location type is string. Checking.
URL is Valid (200 OK): https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje/
Mondom nagyszerű, nézzük meg egy direkt elrontott linkkel is, utána írtam egy 1-est:
https://www.szeretlekmagyarorszag.hu/ime-a-tokeletes-toltott-kaposzta-receptje/1A kimenet:
URL Redirected (301 or 302): HTTP/1.1 301 Moved Permanently. Checking Location link.
Headers Location type is string. Checking.
URL is Valid (200 OK): https://www.szeretlekmagyarorszag.hu/eletstilus/1-arany-5-ezust-2-bronz-es-8-olimpiai-kvota/
Hát ez az 1 arany 5 ezüst dolog hogy került oda?(Kínomban röhögök már.)
Kérem, valaki magyarázza el, mi történik itt.
Amúgy ha 123456-ot írok a végére, akkor meg megint a jó linkre dob tovább, és a korábban írt output lesz.Ez így megbízhatatlan, használhatatlan.
-
Taci
addikt
válasz
SUPREME7 #20606 üzenetére
Köszönöm, hogy rámutattatok erre, sok mindent kiderült a válaszokból, pl. az is, hogy nagyon rossz sorokban néztem a header tartalmát. De kerestem YT-videót, és már látom, mit néztem be.
Valóban 301 Moved Permanently.
Arra gondoltam, akkor a lenti/fenti (ki-hogy nézi) szrkiptbe (testIfValidURL) raknék egy olyan részt, hogy vizsgálná a header-ben, hogy ha át van irányítva, akkor mit csináljon.
Valahogy így:if (stripos($headers[0],"301") || stripos($headers[0],"302")){
//
}
Pár kérdés ide:
1) Az úgy látom kb. fix, hogy az első elemet [0] jó ha vizsgálom, így megkaphatom a result code-ot. (Ez ugye ha jól látom, asszociatív tömbnél is [0], tehát rakhatom aget_headers($url, 1)
-be az "1"-et, így is a [0] fogja a státusz sorát azonosítani?2) A "200 OK" az adott. A 301 után mindig Moved Permanently van, vagy néha más is? (pl. Redirect) Elég így vizsgálnom, ahogy fent van, simán csak a 301-re? (Bár itt elég egyértelműen fogalmaz: [link] Na de már nem törlöm ki ezt a pontot.)
3) Ahogy látom, a 302 is átirányítás, csak más fajta. Vizsgáljam ezt is, ki tudja, hátha egyszer pont ezen "akadna fent"?
Arra gondoltam, ha azt találja, hogy át van irányítva (301 vagy 302), akkor vizsgálja meg a header-ben lévő Location alatt lévő linket.
Pl. a töltöttkáposztásnál ez van benne:
Location: https://www.szeretlekmagyarorszag.hu/rokaland/ime-a-tokeletes-toltott-kaposzta-receptje/ (a félkövérben változott)És ha ott 200 OK van a headerben, akkor végülis sikeres a teszt.
Ezt az ellenőrzést kicsit trükkösebb volt, de végül úgy sikerült, hogy így hívom meg:get_headers($url, 1)
Tehát beletéve az 1-est, és így asszociatív tömböt ad vissza. Aztán azt is láttam, hogy a "Location" kell nekem, abban van, hogy hova irányít. De pl. a káposztásnál 2 eleme is van, szóval azt is vizsgálnom kell, ha több van benne.
Mert pl. amire elsőre irányít ($headers['Location'][0]), annak a végén nincs "/", a másiknak meg ($headers['Location'][1]) van. És az első újra 301, ami átdob a másodikra, és az végül már 200 OK.Szóval körülményesen, de meg lehet oldani.
Jól csinálom így? Vagy van egyszerűbb módja?Köszi az iránymutatást.
-
SUPREME7
őstag
válasz
pelyib #20605 üzenetére
Cloudflare védelem vagy egyéb ellenőrzés miatt 301-gyel van átirányítva a cél url-re. Get_headers elvileg a curl-höz hasonlóan default követi a redirectet, szóval elvileg a kapott tömbben kellene lennie 200-as responsenak is (persze ha átengedte mondjuk a cloudflare, ami elég köcsög cucc...)
-
pelyib
tag
Mert az tenyleg nem "valid":
❯ curl -I https://www.hvg.hu/rss
HTTP/2 301
date: Sat, 22 May 2021 15:44:52 GMT
content-type: text/html
location: https://hvg.hu/rss
set-cookie: uid=AAseX2CpJvQogxXwVFngAg==; expires=Thu, 31-Dec-37 23:55:55 GMT; domain=hvg.hu; path=/
p3p: policyref="/w3c/p3p.xml", CP="CUR ADM OUR NOR STA NID"
cf-cache-status: DYNAMIC
cf-request-id: 0a3659447b00004abdaf9e5000000001
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 65372b1a5c754abd-FRASzerintem ez a method nev becsapos, mert nem azt nezi, h valid e, hanem, h elerheto e. A ketto nem ugyan az.
A "https://ez.egy.valid.domain.com/valami/utvonal" valid URL, de nem letezik.update: masik link is 301
-
SUPREME7
őstag
301 redirect?
-
Taci
addikt
Illetve lenne még egy kérdésem.
Adott ez a szkript, amivel azt ellenőrzöm, valid-e a link:
function testIfValidURL($url){
$headers=get_headers($url);
return stripos($headers[0],"200 OK")?true:false;
}
Erre a (csak a példa kedvéért, a vasárnapi ebédhez előkészített) linkre miért mondja azt, hogy nem valid?
$feed_link = "https://www.szeretlekmagyarorszag.hu/ime-a-tokeletes-toltott-kaposzta-receptje/";
if (testIfValidURL($feed_link) === FALSE){
echo "nem valid. skip";
}
Kiírja, hogy:
nem valid. skipDe miért?
Megnézi a szkript a header-t, hogy tartalmazza-e a "200 OK" visszatérési értéket. És tartalmazza, nyilván, legalábbis a link megnyílik, és Chrome dev tools-ban is ott világít zölddel a Network tab alatt, hogyStatus Code: 200 OK
Vagy az a baja, hogy nem az első tömbelemben ($headers[0]) van?Ha így nem tökéletes a fenti szkript, hogyan módosítsam, hogy az legyen, hogy minden ilyen helyzetet lekezeljen?
Köszi.
-
Taci
addikt
Azt találtam, hogy van benne (a load()-ban) ellenőrzés is:
Returnstrue
on success orfalse
on failure.Szóval akkor valószínűleg így jó lehet:
$xmlDoc = new DOMDocument();
if($xmlDoc->load($xml) === FALSE){
echo "hiba az xml-ben (content not valid). skip<br>";
}
És utána dolgozhatok az $xmlDoc-kal tovább, mert az if-ben így már a feltöltés (load()) is megvolt az ellenőrzéssel együtt.
Legalábbis remélem, jól logikázok.
Új hozzászólás Aktív témák
Hirdetés
- Csere-Beszámítás! Olcsó Számítógép PC Akár játékra! Intel X5650 / GTX 1650 / 24GB / 240SSD+ 500HDD
- LG OLED Televíziók: KÉSZLETKISÖPRÉS -30%
- ÚJ HP EliteBook 840 G8 - 14"FHD IPS - i5-1145G7 - 32GB - 512GB SSD - Win10 - 6 hónap Garancia
- Geforce GTX 1050, 1050 Ti, 1060, 1650, 1660 - GT 1030 - Low profile is (LP)
- Xiaomi Redmi Note 13 5G 256GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest