Koks yra geriausias būdas įvesti naudotojo įvestį naudojant PHP?

Ar yra kažkokia „catchall“ funkcija, kuri gerai dezinfekuoja naudotojo įvestį SQL injekcijoms ir „XSS“ atakoms, bet leidžia tam tikrų tipų html žymes?

981
24 сент. „UltimateBrent“ rinkinys 24 rugsėjis 2008-09-24 23:20 '08 at 23:20 pm 2008-09-24 23:20
@ 18 atsakymų

Tai yra įprasta klaidinga nuomonė, kad vartotojo įvestį galima filtruoti. PHP netgi turi (dabar pasenusią) „funkciją“, vadinamą magijos kabutėmis, kuri yra pagrįsta šia idėja. Tai yra nesąmonė. Pamirškite filtravimą (arba valymą ar tai, ką žmonės jį vadina).

Ką reikia padaryti, kad išvengtumėte problemų, yra gana paprasta: kai įterpiate eilutę į išorinį kodą, turėtumėte vengti to pagal šios kalbos taisykles. Pavyzdžiui, jei įterpiate eilutę į tam tikrą „MySql SQL“ taikymą, šiam tikslui turėtumėte vengti eilutės su „MySql“ funkcija ( mysqli_real_escape_string ). (Arba, jei yra duomenų bazių, parengtų pareiškimų naudojimas yra geriausias būdas, kai įmanoma)

Kitas pavyzdys yra HTML: jei į HTML žymėjimą htmlspecialchars eilutes, venkite jos naudoti htmlspecialchars . Tai reiškia, kad kiekvienas echo ar print htmlspecialchars turi naudoti htmlspecialchars .

Trečiasis pavyzdys gali būti korpuso komandos: jei ketinate įterpti eilutes (pvz., Argumentus) į išorines komandas ir paskambinti jas naudojant exec , tada turėtumėte naudoti escapeshellcmd ir escapeshellarg .

Ir taip toliau ...

Vienintelis laikas, kai reikia aktyviai filtruoti duomenis, yra, jei sutinkate su iš anksto suformatuotu įėjimu. Pavyzdžiui. jei leisite naudotojams pateikti HTML žymėjimą, kurį planuojate rodyti svetainėje. Tačiau jūs turite būti atsargūs, kad būtų išvengta bet kokių išlaidų, nes nesvarbu, kaip gerai jį filtruojate, tai visada bus potencialus saugumo pagrindas.

1084
25 сент. Atsakymas yra suteiktas 25 kiaulytėms . 2008-09-25 01:30 '08, 1:30, 2008-09-25 01:30

Nebandykite užkirsti kelio SQL injekcijai dezinfekuojant įvesties duomenis.

Vietoj to neleiskite naudoti duomenų, kai kuriate SQL kodą . Naudokite paruoštas išraiškas (t. Y. Naudojant šablono užklausos parametrus), kuriose naudojami susieti kintamieji. Tai yra vienintelis būdas užtikrinti, kad „SQL“ injekcijos nebūtų.

Daugiau informacijos apie SQL injekcijos prevenciją žr. Mano svetainėje http://bobby-tables.com/ .

186
09 окт. Atsakymą pateikė Andy Lester 09 okt. 2008-10-09 09:28 '08 at 9:28 2008-10-09 09:28

Ne Jūs negalite visiškai filtruoti duomenų be jokio konteksto, kuriam reikia. Kartais norite įvesti SQL užklausą kaip įvestį, o kartais norite įvesti HTML kaip įvestį.

Turite filtruoti įrašą baltame sąraše - įsitikinkite, kad duomenys atitinka tam tikrą jūsų tikėtinos informacijos specifikaciją. Tada, prieš naudodamiesi, reikia vengti to, priklausomai nuo konteksto, kuriame jį naudojate.

SQL duomenų apsaugos ekranas - siekiant išvengti SQL injekcijos - labai skiriasi nuo duomenų saugojimo proceso (X) HTML, kad būtų išvengta XSS.

72
24 сент. Daniel Papasian atsakymas 24 sep . 2008-09-24 23:24 '08 at 23:24 pm 2008-09-24 23:24

PHP dabar turi naujas geras filter_input funkcijas, kurios, pvz., Atleidžia jus nuo „galutinio reguliaraus el. Laiško išraiška“ dabar, kai turite integruotą tipą FILTER_VALIDATE_EMAIL

Mano filtrų klasė (naudojant „JavaScript“, kad būtų paryškinti klaidų laukai) gali būti suaktyvinta arba „ajax“ prašymu, arba įprastu paštu. (žr. pavyzdį žemiau)

  class FormValidator { public static $regexes = Array( 'date' => "^[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{4}\$", 'amount' => "^[-]?[0-9]+\$", 'number' => "^[-]?[0-9,]+\$", 'alfanum' => "^[0-9a-zA-Z ,.-_\\s\?\!]+\$", 'not_empty' => "[a-z0-9A-Z]+", 'words' => "^[A-Za-z]+[A-Za-z \\s]*\$", 'phone' => "^[0-9]{10,11}\$", 'zipcode' => "^[1-9][0-9]{3}[a-zA-Z]{2}\$", 'plate' => "^([0-9a-zA-Z]{2}[-]){2}[0-9a-zA-Z]{2}\$", 'price' => "^[0-9.,]*(([.,][-])|([.,][0-9]{2}))?\$", '2digitopt' => "^\d+(\,\d{2})?\$", '2digitforce' => "^\d+\,\d\d\$", 'anything' => "^[\d\D]{1,}\$" ); private $validations, $sanatations, $mandatories, $errors, $corrects, $fields; public function __construct($validations=array(), $mandatories = array(), $sanatations = array()) { $this->validations = $validations; $this->sanatations = $sanatations; $this->mandatories = $mandatories; $this->errors = array(); $this->corrects = array(); }  public function validate($items) { $this->fields = $items; $havefailures = false; foreach($items as $key=>$val) { if((strlen($val) == 0 || array_search($key, $this->validations) === false)  array_search($key, $this->mandatories) === false) { $this->corrects[] = $key; continue; } $result = self::validateItem($val, $this->validations[$key]); if($result === false) { $havefailures = true; $this->addError($key, $this->validations[$key]); } else { $this->corrects[] = $key; } } return(!$havefailures); }  public function getScript() { if(!empty($this->errors)) { $errors = array(); foreach($this->errors as $key=>$val) { $errors[] = "'INPUT[name={$key}]'"; } $output = '$$('.implode(',', $errors).').addClass("unvalidated");'; $output .= "new FormValidator().showMessage();"; } if(!empty($this->corrects)) { $corrects = array(); foreach($this->corrects as $key) { $corrects[] = "'INPUT[name={$key}]'"; } $output .= '$$('.implode(',', $corrects).').removeClass("unvalidated");'; } $output = "<script type='text/javascript'>{$output} </script>"; return($output); }  public function sanatize($items) { foreach($items as $key=>$val) { if(array_search($key, $this->sanatations) === false  !array_key_exists($key, $this->sanatations)) continue; $items[$key] = self::sanatizeItem($val, $this->validations[$key]); } return($items); }  private function addError($field, $type='string') { $this->errors[$field] = $type; }  public static function sanatizeItem($var, $type) { $flags = NULL; switch($type) { case 'url': $filter = FILTER_SANITIZE_URL; break; case 'int': $filter = FILTER_SANITIZE_NUMBER_INT; break; case 'float': $filter = FILTER_SANITIZE_NUMBER_FLOAT; $flags = FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_THOUSAND; break; case 'email': $var = substr($var, 0, 254); $filter = FILTER_SANITIZE_EMAIL; break; case 'string': default: $filter = FILTER_SANITIZE_STRING; $flags = FILTER_FLAG_NO_ENCODE_QUOTES; break; } $output = filter_var($var, $filter, $flags); return($output); }  public static function validateItem($var, $type) { if(array_key_exists($type, self::$regexes)) { $returnval = filter_var($var, FILTER_VALIDATE_REGEXP, array("options"=> array("regexp"=>'!'.self::$regexes[$type].'!i'))) !== false; return($returnval); } $filter = false; switch($type) { case 'email': $var = substr($var, 0, 254); $filter = FILTER_VALIDATE_EMAIL; break; case 'int': $filter = FILTER_VALIDATE_INT; break; case 'boolean': $filter = FILTER_VALIDATE_BOOLEAN; break; case 'ip': $filter = FILTER_VALIDATE_IP; break; case 'url': $filter = FILTER_VALIDATE_URL; break; } return ($filter === false) ? false : filter_var($var, $filter) !== false ? true : false; } } 

Žinoma, turėkite omenyje, kad jums taip pat reikia pabėgti nuo SQL užklausų, priklausomai nuo to, kokio tipo db naudojate (mysql_real_escape_string () yra nenaudingas, pavyzdžiui, SQL serveriui). Galite tai tvarkyti automatiškai atitinkamu programos lygiu, pvz., ORM. Be to, kaip minėta pirmiau: išvesties į html naudoti kitas specializuotas php funkcijas, pvz., Htmlspecialchars;)

Kad iš tikrųjų leistumėte HTML įvestį naudodami bendras klases ir (arba) žymes, tai priklauso nuo vieno iš pasirinktų xss tikrinimo paketų. NEGALIMA SAVO MODELIŲ HTML SOCKET!

44
25 сент. atsakymą pateikė SchizoDuckie rugsėjo 25 d 2008-09-25 02:12 '08 2:12 am 2008-09-25 02:12

Ne, ne.

Visų pirma, SQL injekcija yra įvesties duomenų filtravimo problema, o XSS - tai išvesties ekranas, todėl jūs negalite net atlikti šių dviejų operacijų kodo gyvavimo cikle.

Pagrindinės nykščio taisyklės

  • SQL užklausai susieti parametrus (kaip ir SKVN) arba naudokite užklausos kintamiesiems savo pabėgimo funkciją (pvz., mysql_real_escape_string() )
  • Jei norite filtruoti nepageidaujamą HTML, naudokite strip_tags() .
  • Atstatykite visus kitus išėjimus su htmlspecialchars() ir čia prisiminkite 2 ir 3 parametrus.
39
24 сент. Peter Bailey atsakymas 24 Sep. 2008-09-24 23:30 '08, 11.30 val. 2008-09-24 23:30

Norėdami išspręsti XSS problemą, peržiūrėkite HTML Cleaner . Jis yra gana konfigūruojamas ir turi gerą patirtį.

Kalbant apie SQL injekcijos išpuolius, įsitikinkite, kad patikrinate vartotojo įvestį, o tada paleiskite jį, nors mysql_real_escape_string (). Tačiau ši funkcija nerauna visų atakų prieš injekcijas, todėl svarbu prieš juos įterpiant į užklausos eilutę patikrinti duomenis.

Geriausias sprendimas yra naudoti apmokytus operatorius.

20
24 сент. Atsakymą pateikė 24 „ jasonbar“ sep . 2008-09-24 23:29 '08 at 11:29 2008-09-24 23:29

PHP 5.2 įdiegta filter_var funkcija.

Jis palaiko daugybę filtrų SANITIZE, VALIDATE.

http://php.net/manual/en/function.filter-var.php

18
15 окт. atsakymas pateikiamas dangel 15 oct. 2012-10-15 11:40 '12 11:40 2012-10-15 11:40

Vienas triukas, kuris gali padėti tam tikru atveju, yra tas, kad turite tokį puslapį kaip /mypage?id=53 , ir jūs naudojate ID kodą WHERE, kad įsitikintumėte, jog identifikatorius tikrai yra sveikasis skaičius, pavyzdžiui:

 if (isset($_GET['id'])) { $id = $_GET['id']; settype($id, 'integer'); $result = mysql_query("SELECT * FROM mytable WHERE id = '$id'"); # now use the result } 

Bet, žinoma, tai pašalina tik vieną konkretų ataką, todėl perskaitykite visus kitus atsakymus. (Ir taip, žinau, kad aukščiau nurodytas kodas yra nedidelis, tačiau jis turi ypatingą apsaugą.)

15
09 марта '10 в 2:14 2010-03-09 02:14 Atsakymą pateikė Hamish Downer, kovo 10 d., 10:14, 2010-03-09 02:14

Tai, ką apibūdinate čia, yra dvi atskiros problemos:

  • Vartotojo įvesties išvalymas / filtravimas.
  • Išeiti iš ekranų.

1) Vartotojo įvestis visada turėtų būti laikoma bloga.

Būtina naudoti paruoštus pareiškimus arba filtravimą naudojant mysql_real_escape_string. PHP taip pat turi filtro_inputį, kuris yra gera vieta pradėti.

2) Tai yra didelė tema, ir tai priklauso nuo produkcijos konteksto. HTML yra tokių sprendimų, kaip htmlpurifier. Paprastai visada venkite visko, ką jūs išleisite.

Abu klausimai yra per dideli, kad juos būtų galima įtraukti į vieną įrašą, tačiau yra daug pranešimų, kurie yra išsamiau aptariami:

PHP išvesties metodai

Saugesnė PHP produkcija

10
16 июля '12 в 13:44 2012-07-16 13:44 atsakymas Andriejui duotas liepos 16 d. 12 val. 13.44

Jei naudojate „PostgreSQL“, įvedimas su PHP gali būti pašalintas su pg_escape_string ()

  $username = pg_escape_string($_POST['username']); 

Iš dokumentacijos ( http://php.net/manual/es/function.pg-escape-string.php ):

pg_escape_string () įgyvendina eilutę užklausai dėl duomenų bazės. Ji grąžina pabėgimo eilutę PostgreSQL formatu be kabučių.

4
27 мая '15 в 18:36 2015-05-27 18:36 atsakymas pateikiamas Alejandro Silva

Naudotojo įvesties dezinfekavimo būdai PHP:

  • Naudokite modernią „MySQL“ ir „PHP“ versiją.

  • Nustatykite kodavimą aiškiai:

    •   $ mysqli-> set_charset ("utf8"); 
      vadovas
    •   $ pdo = naujas SKVN („mysql: host = localhost; dbname = testdb; charset = UTF8 ', $ user, $ password); 
      vadovas
    •   $ pdo-> exec („nustatyti vardus utf8“); 
      vadovas
    •   $ pdo = naujas SKVN ( "mysql: host = $ host; dbname = $ db", $ user, $ pass,  masyvas ( SKVN :: ATTR_ERRMODE => SKVN :: ERRMODE_EXCEPTION, SKVN :: MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ) ); 
      vadovas
    •   mysql_set_charset ('utf8') 
      [Nutraukta PHP 5.5.0, pašalinta PHP 7.0.0].
  • Naudokite saugius kodus:

    • Pasirinkite utf8, latin1, ascii .., nenaudokite pažeidžiamų kodų big5, cp932, gb2312, gbk, sjis.
  • Naudoti erdvinę funkciją:

    • „MySQLi Ready“ programos:
        $ stmt = $ mysqli-> parengti ('SELECT * FROM test WHERE name =? LIMIT 1'); 
      $ param = "'OR 1 = 1 / *";
      $ stmt-> bind_param ('s', $ param);
      $ stmt-> vykdyti ();
    • SKVN :: quote () - nurodo citavimo žymas aplink įvesties eilutę (jei reikia) ir vengia specialių simbolių eilutės įvestyje, naudojant citavimo stilių, atitinkantį pagrindinį tvarkyklę:

        $ pdo = naujas SKVN („mysql: host = localhost; dbname = testdb; charset = UTF8 ', $ user, $ password);  aiškiai nustatyti simbolių rinkinį 
      $ pdo-> setAttribute (SKVN :: ATTR_EMULATE_PREPARES, false); neskaitytini teiginiai, kad MySQL negali būti parengta (siekiant išvengti injekcijos)
      $ var = $ pdo-> citata ("'OR 1 = 1 / *"); ne tik išeina iš pažodinio, bet ir cituoja (viena citata) $ stmt = $ pdo-> užklausa ("SELECT * FROM test WHERE name = $ var LIMIT 1");
    • SKVN parengtos ataskaitos : prieš parengtas „MySQLi“ komandos palaiko daugiau duomenų bazių tvarkyklių ir pavadintų parametrų:

        $ pdo = naujas SKVN („mysql: host = localhost; dbname = testdb; charset = UTF8 ', $ user, $ password);  aiškiai nustatyti simbolių rinkinį 
      $ pdo-> setAttribute (SKVN :: ATTR_EMULATE_PREPARES, false); neskaitytini teiginiai, kad MySQL negali būti parengta (siekiant išvengti injekcijos) $ stmt = $ pdo-> parengti ('SELECT * FROM test WHERE name =? LIMIT 1'); $ stmt-> vykdyti (["'OR 1 = 1 / *"]);
    • mysql_real_escape_string [pasenęs PHP 5.5.0, pašalintas PHP 7.0.0].
    • mysqli_real_escape_string Sukelia specialius simbolius eilutėje, kuri turi būti naudojama SQL, atsižvelgiant į esamą ryšio kodavimą. Tačiau rekomenduojama naudoti paruoštus pareiškimus, nes jie yra ne tik pabėgusios linijos, bet instrukcijoje yra visas užklausų vykdymo planas, įskaitant lenteles ir indeksus, kuriuos jis naudos, tai yra optimizuotas būdas.
    • Naudokite atskirus kabutes ('') aplink savo kintamuosius jūsų užklausoje.
  • Patikrinimo kintamajame yra tai, ko tikitės:

    • Jei laukiate viso numerio, naudokite:
        ctype_digit - patikrinkite skaitmeninį (-ius) simbolį (-ius); 
      $ value = (int) $ vertė;
      $ value = intval ($ vertė);
      $ var = filter_var ('0755', FILTER_VALIDATE_INT, $ parinktys);
    • Jei norite naudoti eilutes:
        is_string () - Ieškoti yra kintamasis 

      Naudoti filtro funkciją filter_var () - filtruoja kintamąjį su nurodytu filtru:
        $ email = filter_var ($ email, FILTER_SANITIZE_EMAIL); 
      $ newstr = filter_var ($ str, FILTER_SANITIZE_STRING);
      daugiau iš anksto nustatytų filtrų
    • filter_input () - gauti konkretų išorinį kintamąjį pagal pavadinimą ir galbūt filtruokite jį:
        $ search_html = filter_input (INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS); 
    • preg_match () - atlikite reguliarios išraiškos atitikimą,
    • Parašykite savo patvirtinimo funkciją.
4
25 февр. Atsakymas, kurį pateikė Mark Martin vasario 25 d 2018-02-25 09:11 '18, 9:11

Nėra bendros funkcijos, nes yra keletas problemų, kurias reikia išspręsti.

  • SQL injekcija . Šiandien, kaip taisyklė, kiekvienas PHP projektas turėtų naudoti paruoštas instrukcijas per PHP duomenų objektus (SKVN) kaip geriausią praktiką, užkertant kelią klaidai iš klaidinančios citatos, taip pat visapusišką sprendimą prieš injekcijas. Jis taip pat yra lankstiausias ir saugiausias būdas pasiekti jūsų duomenų bazę.

    Atsisakykite SKVN vadovo („Vienintelė teisinga“) beveik viską, ką reikia žinoti apie SKVN. (Nuoširdžiai dėkoju pagrindiniam SO indėliui, @YourCommonSense, už šį puikų šaltinį.)

  • XSS - dezinfekuokite duomenis kelyje į ...

    • HTML valiklis trunka gana ilgai ir vis dar aktyviai atnaujinamas. Ją galite naudoti, kad dezinfekuotumėte kenkėjišką įvestį, išlaikant turtinga ir pritaikoma baltojo sąrašo žymą. Puikiai dirba su daugeliu WYSIWYG redaktorių, tačiau kai kuriais atvejais gali būti sunku.

    • Kitais atvejais, kai nenorime priimti HTML / „Javascript“, naudojosi šia paprasta funkcija (ir atlikau keletą bandymų prieš „XSS“):

      function sanitizeXSS () { $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST; }

  • XSS - išvalykite duomenis iš išvesties ... jei negarantuojate, kad duomenys buvo tinkamai dezinfekuoti prieš įtraukdami juos į duomenų bazę, prieš juos rodydami naudotojui, turėsite juos dezinfekuoti, galime naudoti šiuos naudingus PHP funkcijos:

    • Kai skambinate echo ar print kad būtų rodomos naudotojo pateiktos vertės, naudokite htmlspecialchars jei duomenys nebuvo tinkamai dezinfekuoti saugiai ir leidžiama rodyti HTML.
    • json_encode yra saugus būdas pateikti pasirinktines vertes iš PHP į „Javascript“
  • Skambinate į išorines apvalkalo komandas, naudodami exec() arba system() arba backtick operatorių, jei taip yra, be SQL Injection ir XSS, jums gali būti papildoma problema adresuojant naudotojus, turinčius kenkėjiškų komandų jūsų serveryje. Jei norite išvengti viso OR escapeshellarg kad išvengtumėte atskirų argumentų, turite naudoti escapeshellcmd .

3
17 дек. atsakymą pateikė webaholik 17 dec. 2017-12-17 21:47 '17 at 21:47 2017-12-17 21:47

Lengviausias būdas išvengti klaidų dezinfekuojant įvesties duomenis ir ekranavimo duomenis yra naudoti PHP sistemą, pvz., „ Symfony“ , „ Nette“ ir kt. arba dalis šios struktūros (šablono variklis, duomenų bazės lygis, ORM).

Šablono variklis, pvz., „ Twig“ arba numatytoji „Latte“, turi išeitį - nereikia rankiniu būdu nuspręsti, jei teisingai atsižadėjote savo produkciją priklausomai nuo konteksto (tinklalapio HTML arba „Javascript“ dalis).

Sistema automatiškai dezinfekuoja įvestį, ir turite tiesiogiai naudoti $ _POST, $ _GET arba $ _SESSION kintamuosius, bet per tokį mechanizmą, kaip maršrutas, sesijos tvarkymas ir kt.

Duomenų bazės (modelio) lygmenyje yra ORM sistemos, pvz., Doktrina ar įvyniojimai aplink SKVN, pvz., „Nette“ duomenų bazė.

Daugiau apie tai galite sužinoti čia. Kas yra programinės įrangos aplinka?

3
17 июля '15 в 20:13 2015-07-17 20:13 Atsakymą pateikė Ondřej Šotek liepos 15 d. 15 d. 20:13 2015-07-17 20:13

Tiesiog norėjau pridėti, kad kilus problemai, jei naudojate php DOMDocument, kad padarytumėte html produkciją, jis automatiškai išeis į teisingą kontekstą. Atributas (reikšmė = "") ir eilutės <span> vidinis tekstas nėra lygūs. Norėdami būti saugiems nuo XSS, perskaitykite: OWASP XSS apsauginis dėklas

2
18 нояб. atsakymą pateikė vartotojo138720 18 nov. 2014-11-18 00:59 '14 0:59 2014-11-18 00:59

Jūs niekada dezinfekuojate įvestį.

Jūs visada dezinfekuojate šią priemonę.

Pakeitimai, kuriuos taikote duomenims, kad juos būtų saugu įtraukti į SQL, visiškai skiriasi nuo tų, kuriuos naudojate įtraukiant į HTML, visiškai skiriasi nuo tų, kuriuos naudojate įtraukiant į „Javascript“, visiškai skiriasi nuo tų, kurie jūs prašote įtraukti į LDIF, yra visiškai skirtingi nuo tų, kuriuos naudojate įtraukiant į CSS, yra visiškai skirtingi nuo tų, kuriuos naudojate įtraukiant į el. paštą ...

Bet kuriuo atveju patikrinkite įvestį - nuspręskite, ar priimti jį tolesniam apdorojimui, arba informuoti vartotoją, kad tai nepriimtina. Tačiau neperžiūrėkite duomenų, kol nepaliks PHP.

Ilgą laiką kažkas bandė sugalvoti vieną ekranavimo duomenų mechanizmą, ir mes baigėme „ magic_quotes “, kurie neužtikrino tinkamo duomenų ištrynimo visoms išvesties reikmėms ir dėl to atsirado kitas įrenginys, reikalaujantis kito kodo veikimo.

1
19 февр. atsakymas pateikiamas simcbean 19 Vas 2018-02-19 15:12 '18, 15:12 2018-02-19 15:12
 function clean_input($data) {  $data = trim($data);  $data = stripslashes($data);  $data = htmlspecialchars($data);  return $data; } 
0
21 авг. atsakymas, kurį pateikė Erik Thiart 2018-08-21 22:31 '18, 10:31 val. 2018-08-21 22:31

Yra filtrų plėtinys ( howto-link , manual ), kuris gerai veikia su visais GPC kintamaisiais. Tai nėra magiškas dalykas, bet jūs vis dar turite jį naudoti.

0
ответ дан Till 24 сент. '08 в 23:26 2008-09-24 23:26