Php angalia uwepo wa kutofautiana. Swali: Jinsi ya kuangalia ikiwa kigezo kipo

Ninataka kuangalia ikiwa utofauti upo. Sasa mimi hufanya kitu kama hiki:

Jaribu: myVar isipokuwa NameError: # Fanya kitu.

Kuna njia zingine bila ubaguzi?


2018-05-09 13:10

Majibu:

Ili kuangalia uwepo wa tofauti ya ndani:

Ikiwa "myVar" katika locals(): # myVar ipo.

Ili kuangalia uwepo wa tofauti ya kimataifa:

Ikiwa "myVar" katika globals(): # myVar ipo.

Ili kuangalia ikiwa kitu kina sifa:

Ikiwa hasattr(obj, "attr_name"): # obj.attr_name ipo.


2018-05-09 13:16

Kutumia vigeu ambavyo havijafafanuliwa au kuwekwa (kwa uwazi au kwa uwazi) karibu kila wakati ni mbaya. Yoyote kwani hii inaonyesha kuwa mantiki ya programu haijafikiriwa vizuri na itasababisha tabia isiyotabirika.

Ujanja unaofuata, ambao ni sawa na wako, utahakikisha kuwa kutofautisha kuna baadhi thamani kabla ya matumizi:

Jaribu: myVar ila NameError: myVar = None # Sasa uko huru kutumia myVar bila Python kulalamika.

Walakini, bado sidhani kama hili ni wazo nzuri - kwa maoni yangu, unapaswa kurekebisha nambari yako ili kuzuia hali hii kutokea.


2018-05-09 13:19

Kutumia try / except ndio njia bora ya kuangalia uwepo wa kutofautisha. Lakini kwa hakika kuna njia bora ya kufanya kile unachofanya kuliko kuweka/kujaribu vigeu vya kimataifa.

Kwa mfano, ikiwa unataka kuanzisha utofauti wa kiwango cha moduli mara ya kwanza utendakazi unapoitwa, ungekuwa bora zaidi na msimbo kitu kama hiki:

My_variable = None def InitMyVariable(): my_variable kimataifa ikiwa my_variable is None: my_variable = ...


2018-05-09 13:27

kwa vitu/moduli, unaweza pia

"var" katika dir(obj)

Kwa mfano,

>>> darasa Kitu(kitu): ... kupita ... >>> c = Kitu() >>> c.a = 1 >>> "a" katika dir(c) Kweli >>> "b" in dir (c) Uongo


2017-10-28 18:39

Njia rahisi ni kuianzisha kwanza na myVar = None

Kisha baadaye:

Ikiwa myVar sio Hakuna: # Fanya kitu


2018-06-04 18:46

Nadhani jaribio litatumika katika kazi inayofanana na jibu la mtumiaji97370 sipendi jibu hili kwa sababu linachafua nafasi ya majina ya ulimwengu. Njia moja ya kurekebisha hii ni kutumia darasa badala yake:

Class InitMyVariable(object): my_variable = None def __call__(self): ikiwa self.my_variable is None: self.my_variable = ...

Sipendi hii kwa sababu inachanganya msimbo na kufungua maswali kama hii inathibitisha muundo wa programu wa Singleton? Kwa bahati nzuri, Python imeruhusu kazi kuwa na sifa kwa muda, ikitupa suluhisho hili rahisi:

Def InitMyVariable(): ikiwa InitMyVariable.my_variable is None: InitMyVariable.my_variable = ... InitMyVariable.my_variable = Hakuna


2018-03-25 20:31

2018-05-09 13:12

Njia ambayo mara nyingi hufanya kazi vizuri kwa kushughulikia hali ya aina hii ni kutoangalia kwa uwazi ikiwa utofauti upo lakini endelea tu na kufunika matumizi ya kwanza ya utofauti ambao haupo katika jaribio/isipokuwa NameError.

kazi tupu (11)

Nina (au sina) $_GET["myvar"] kutofautisha kutoka kwa kamba ya hoja yangu na ninataka kuangalia ikiwa utofauti huo upo na pia ikiwa thamani inalingana na kitu ndani ya taarifa yangu:

Ninachofanya na kufikiria sio njia bora ya kufanya:

if(isset($_GET["myvar"]) && $_GET["myvar"] == "kitu"): fanya kitu

Hii ni kesi rahisi, lakini fikiria kulinganisha nyingi za hizi $myvar anuwai.

Majibu

Hii ni sawa na jibu lililokubaliwa, lakini hutumia in_array badala yake. Napendelea kutumia empty() katika hali hii. Pia ninapendekeza kutumia tamko jipya la safu ambayo inapatikana katika PHP 5.4.0+.

$kuruhusiwa = ["kitu","nothing"]; if(!tupu($_GET["myvar"]) && in_array($_GET["myvar"],$imeruhusiwa))(..)

Hapa kuna chaguo la kukokotoa kuangalia thamani nyingi mara moja.

$ arrKeys = array_keys($_GET); $kuruhusiwa = ["kitu","nothing"]; kazi checkGet($arrKeys,$allowed) ( foreach($arrKeys as $key) ( if(in_array($_GET[$key],$allowed)) ( $values[$key]; ) ) rudisha $values; )

Ninatumia kazi yangu yote muhimu exst(), ambayo hutangaza kiatomati vigezo.

$element1 = exst($arr["key1"]); $val2 = exst($_POST["key2"], "novalue"); /** * Function exst() - Hukagua ikiwa utofauti umewekwa * (nakili/ubandike katika sehemu yoyote ya msimbo wako) * * Ikiwa utofauti umewekwa na sio tupu hurejesha kutofautisha (hakuna mabadiliko) * Ikiwa kutofautisha haijawekwa au tupu, hurejesha thamani chaguo-msingi ya $ * * @param mchanganyiko $var * @param mchanganyiko $default * * @return mchanganyiko */ kazi exst(& $var, $default = "") ( $t = "" ; ikiwa (!isset($var) || !$var) (ikiwa (isset($default) && $default != "") $t = $default; ) vinginevyo ( $t = $var; ) ikiwa (is_string ($t)) $t = trim($t) rudisha $t;

Kweli, unaweza kuendelea na if($_GET["myvar"] == "kitu") kwani hali hiyo inadhania kuwa utofauti pia upo. Ikiwa sivyo, usemi huo pia utasababisha uongo .

Nadhani ni sawa kufanya hivi kwa masharti kama hapo juu. Hakuna madhara kwa kweli.

Swali langu ni: kuna njia ya kufanya hivyo bila kutangaza kutofautisha mara mbili?

Hapana, hakuna njia ya kufanya hivyo kwa usahihi bila kufanya ukaguzi mbili. Nachukia pia.

Njia moja ya kuzunguka hii ni kuagiza anuwai zote muhimu za GET katika sehemu moja kuu kwenye safu au kitu cha aina fulani (MVC nyingi hufanya hivi kiotomatiki) na kuweka mali zote zinazohitajika baadaye. (Badala ya kupata vigezo vya hoja kupitia nambari.)

Ikiwa (isset($_GET["myvar"]) == "kitu")

Shukrani kwa Mellowsoon na Pekka, nilifanya utafiti hapa na kuja na hii:

  • Angalia na utangaze kila kutofautisha kama batili (ikiwa ni hivyo) kabla ya kuitumia (kama inavyopendekezwa):
!isset($_GET["myvar"]) ? $_GET["myvar"] = 0:0;

*sawa, hii ni rahisi lakini inafanya kazi vizuri, unaweza kuanza kutumia kutofautisha kila mahali baada ya mstari huu

  • Kutumia safu kwa visa vyote:
$myvars = safu("var1", "var2", "var3"); foreach($myvars as $key) !isset($_GET[$key]) ? $_GET[$key] =0:0;

* baada ya hii unaweza kutumia anuwai zako (var1, var2, var3... nk)

PS: chaguo la kukokotoa la kupokea kipengee cha JSON linapaswa kuwa bora zaidi (au mfuatano rahisi wa kupasuka/mlipuko);

Mbinu bora zinakaribishwa :)

SASISHA:

Tumia $_REQUEST badala ya $_GET, kwa njia hii unashughulikia vibadala vya $_GET na $_POST.

Isset($_REQUEST[$key]) ? $_REQUEST[$key] =0:0;

Suluhisho nililopata kutoka kwa mchezo ni kufanya:

Ikiwa($x=&$_GET["myvar"] == "kitu") ( // fanya mambo na $x )

Kama kidokezo, unaweza kuzingatia njia hii:

Inahitajika = safu("myvar" => "defaultValue1", "foo" => "value2", "bar" => "value3", "baz" => "value4"); $ kukosa = array_diff($required, array_keys($_GET)); foreach($missing as $key => $default) ( $_GET[$key] = $default ; )

Unaweka maadili chaguo-msingi na kuweka vigezo ambavyo havijapokelewa kwa thamani chaguo-msingi :)

Kwa bahati mbaya, hii ndiyo njia pekee ya kufanya hivyo. Lakini kuna mbinu za kufanya kazi na safu kubwa. Kwa mfano, kitu kama hiki:

$required = safu("myvar", "foo", "bar", "baz"); $ kukosa = array_diff($required, array_keys($_GET));

Tofauti ya $missing sasa ina orodha ya thamani zinazohitajika lakini hazipo kwenye safu $_GET. Unaweza kutumia safu $missing kuonyesha ujumbe kwa mgeni.

Au unaweza kutumia kitu kama hiki:

$required = safu("myvar", "foo", "bar", "baz"); $ kukosa = array_diff($required, array_keys($_GET)); foreach($missing as $m) ( $_GET[$m] = null; )

Sasa kila kipengele kinachohitajika kina thamani chaguo-msingi. Sasa unaweza kutumia if ($_GET["myvar"] == "kitu") bila kuwa na wasiwasi kuhusu ufunguo kutowekwa.

Sasisha

Njia nyingine ya kusafisha nambari itakuwa kutumia kitendakazi ambacho hukagua ikiwa thamani imewekwa.

Kazi getValue($key) ( if (!isset($_GET[$key])) ( return false; ) rudisha $_GET[$key]; ) ikiwa (getValue("myvar") == "kitu") ( / /Fanya kitu)

kwa nini usitengeneze chaguo za kukokotoa kwa hili, ubadilishe kigezo unachotaka kuangalia kuwa kigezo halisi, k.m.

Kazi _FX($name) (ikiwa (isset($$name)) rudisha $$name; vinginevyo rudisha null;)

kisha unafanya _FX("param") == "123" , wazo tu

Nimepata (zaidi) nambari bora ya kufanya hivyo ikiwa unataka kujaribu kitu katika .

Ikiwa [[ $1 = "" ]] basi mwangwi "$1 ni tupu" vinginevyo echo "$1 imejaa" fi

Kwa nini yote haya? Kila kitu kipo katika Bash, lakini ni tupu kwa chaguo-msingi, kwa hivyo test -z na test -n haziwezi kukusaidia.

Ikiwa [ $(#1) = 0 ] basi mwangwi "$1 ni tupu" vinginevyo echo "$1 imejaa" fi

Unaweza kuangalia ikiwa utofauti uliopeanwa upo (hiyo ni, umeanzishwa au la). Ili kufanya hivyo, tumia kazi:

Kipengele (kigeu);

Ikiwa utofauti haupo kwa sasa (haijawahi kupewa thamani mahali popote hapo awali au ilifutwa na chaguo la kukokotoa haijawekwa () ), kisha kazi mali () anarudi uongo , vinginevyo - kweli :

$ x = 5;

ikiwa (imewekwa($x))

mwangwi ‘< BR >Kigezo cha $ x ipo, ‘, “thamani yake ni $ x < BR >”;

Ifuatayo itaonekana kwenye skrini:

Tofauti $ x ipo, thamani yake ni 5

Ni muhimu kukumbuka kuwa hatuwezi kutumia utofauti ambao haujaanzishwa katika programu - hii itatoa onyo kutoka kwa mkalimani. PHP .

Ili kujua kama thamani ni kigeugeu tupu , kipengele kinatumika:

tupu ( kutofautiana);

Ikiwa thamani ya kutofautisha ni sufuri ,“0”, NULL , mstari tupu (“” ), uwongo, tofauti haijatangazwa au ni safu tupu , basi kitendakazi hiki kinarudi kweli , vinginevyo - uongo .

Ili kuangalia aina kutofautiana, kazi hutumiwa:

Is_string(kigeu);

ni _ int (kigeu);

ni _ kuelea (kigeu);

ni _ null (kigeu);

ni _ safu (kigeu);

ni _ nambari (kigeu); - ikiwa kutofautisha ni nambari ( nambari kamili , kuelea ) au mfuatano ulio na nambari pekee.

Vipengele hivi vinarudi kweli ikiwa tofauti ni ya aina maalum.

Pato la data

Toleo ambalo halijaumbizwa

Isiyo na umbizo Matokeo ya kamba au maadili tofauti hufanywa na kazi:

mwangwi orodha ya vigezo;

mwangwi mstari;

Wapi orodha ya vigezo - majina ya vigeu vya pato vilivyotenganishwa na koma.

Ikiwa tunafanya kazi na kivinjari cha wavuti, basi kazi hii inaongoza pato kwa upande wa mteja wa kivinjari (kwa dirisha lake).

Kama ilivyosemwa tayari, ikiwa majina ya kutofautisha yanapatikana kwenye kamba iliyoambatanishwa na nukuu mbili, basi maadili yanayolingana yanaonyeshwa kwenye skrini badala ya majina haya. Zaidi ya hayo, ikiwa mstari kama huo una vitambulisho HTML (hushughulikia zilizofungwa kwenye mabano ya pembe), kisha kivinjari kinaonyesha hii HTML -code kama inavyopaswa kufanya inapotafsiriwa HTML - hati:

$mwaka = 2012;

ujumbe wa $ = " Wish kila mtu furaha !”;

mwangwi"

Yangu hongera !

”;

mwangwi" Imefika $mwaka mwaka !
$ujumbe
”;

?>

Kichwa cha kiwango kitaonyeshwa kwenye skrini H 3 na salamu inayofuata, yenye neno “ furaha!" itaonyeshwa kwa herufi nzito ya italiki:

Hongera!

Ni 2012! Natamani kila mtu furaha!

Kwa njia hii unaweza kuunda tovuti zinazobadilika.

Toleo lililoumbizwa

Imeumbizwa pato hukuruhusu kuwakilisha nambari zilizoonyeshwa katika mifumo mbali mbali ya nambari, na katika mfumo wa decimal - katika aina anuwai ( miundo ) Ni sawa na towe lililoumbizwa ndani Si na inatekelezwa na majukumu:

chapa ("umbizo", orodha ya pato);

sprintf ("umbizo", orodha ya pato);

Kazi ya kwanza inaonyesha data iliyopangwa kwenye dirisha la kivinjari na inarudi wingi wake.

Chaguo za kukokotoa za pili huunda tu data ya pato, lakini haitoi.

Umbizo ni mlolongo wa maelezo ya mabadiliko kwa maadili ya pato.

Kifafanuzi cha Mabadiliko kwa kila thamani ina fomu:

% Urefu wa Mpangilio wa Kishika Nafasi.Aina ya Usahihi

- Jumla ni ishara ambayo itatumika kukamilisha matokeo ya mabadiliko kwa thamani iliyotolewa urefu (chaguo-msingi - nafasi ); ikiwa ni mhusika mwingine, basi inatanguliwa na nukuu moja ( apostrofi ),

- Mpangilio - kwa chaguo-msingi - kwa haki makali ya shamba la pato; ikiwa kuna minus ( - ), kisha kwa kushoto ,

- Urefu – upana wa uwanja wa pato - idadi ya nafasi zilizotengwa kwa ajili ya kutoa thamani hii. Ikiwa thamani ya pato ina herufi chache kuliko thamani iliyobainishwa urefu , basi nafasi iliyobaki itajazwa nafasi au wahusika wa padding,

- Usahihi - idadi ya maeneo ya desimali katika sehemu ya sehemu ya nambari;

- Aina - aina ya thamani ya pato:

b binary ,

Na ishara ,

d mzima katika mfumo wa nambari ya desimali,

e halisi katika fomu ya kielelezo (hatua ya kuelea),

f halisi katika fomu ya uhakika,

s mstari ,

O mzima katika mfumo wa nambari ya octal,

x mzima katika mfumo wa nambari ya hexadecimal.

Mfano:

php

$ zarp _1 = 6543.21;

$ zarp _2 = 45321.67;

$ familia _1 = "Balaganov";

$ familia _2 = "Bender";

chapa ("< H 1> Malipo h 1>");

printf("%".-12s%".10.2f rub.", $fam_1, $zarp_1);

mwangwi"
";

printf("%".-12s%".10.2f rub.", $fam_2, $zarp_2);

mwangwi"
";

?>

Jambo ( ‘. ). Majina ya mwisho yameachwa yakiwa yamepangwa ( - ) katika upana wa shamba 12 wahusika. Nambari zinawakilishwa katika fomu ya uhakika katika upana wa uwanja 10 wahusika na kwa usahihi 2 maeneo ya desimali, yakiwa yamepangiliwa kulia.

Nyenzo hiyo imekusudiwa haswa kwa waandaaji wa programu za wavuti wanaoanza.

Utangulizi.

Mara nyingi mimi hufikiwa na wateja ambao wamesakinisha CMS au moduli za kujiandikia zilizoandikwa na waandaaji wa programu wapya ambao hawaelewi kinachohitajika ili kulinda data na mara nyingi kunakili vitendaji vya kuchuja bila kufikiria jinsi wanavyofanya kazi na ni nini hasa kinachohitajika kufanywa nao. .

Hapa nitajaribu kuelezea kwa undani iwezekanavyo makosa ya kawaida wakati wa kuchuja data kwenye hati ya PHP na kutoa vidokezo rahisi juu ya jinsi ya kuchuja data kwa usahihi.

Kuna makala nyingi kwenye mtandao kuhusu kuchuja data, lakini si kamili na bila mifano ya kina.

Kujadiliana.

Uchujaji. Kosa namba 1
Kwa vigezo vya nambari hundi ifuatayo inatumika:
$number = $_GET["input_number"]; ikiwa (intval($number)) ( ... tekeleza swala la SQL... )
Kwa nini itasababisha sindano ya SQL? Jambo ni kwamba mtumiaji anaweza kutaja katika kutofautiana ingizo_nambari maana:
1"+MUUNGANO+CHAGUA
Katika hali hiyo, hundi itakamilika kwa mafanikio, kwa sababu kazi ya intval inapata thamani kamili ya kutofautisha, i.e. 1, lakini katika tofauti yenyewe $nambari hakuna kilichobadilika, kwa hivyo msimbo wote hasidi utapitishwa kwa hoja ya SQL.
Uchujaji sahihi:
$number = intval($_GET["input_number"]); ikiwa ($number) ( ... tekeleza swala la SQL... )
Kwa kweli, hali inaweza kubadilika, kwa mfano ikiwa unahitaji kupata safu fulani tu:
ikiwa ($number >= 32 NA $number<= 65)

Ikiwa unatumia visanduku vya kuteua au chaguzi nyingi zilizo na nambari za nambari, fanya ukaguzi ufuatao:
$checkbox_arr = array_map("intval", $_POST["checkbox"]);
safu_ramani
Pia naona kuchuja katika fomu:
$number = htmlspecialchars(intval($_GET["input_number"]));
htmlchar maalum
Au:
$number = mysql_escape_string(intval($_GET["input_number"]));
mysql_escape_string

Hii haiwezi kuleta chochote isipokuwa tabasamu :)

Uchujaji. Kosa namba 2.
Kwa vigezo vya kamba, uchujaji ufuatao hutumiwa:
$input_text = addslashs($_GET["input_text"]);
Utendakazi wa nyongeza huepuka maalum. herufi, lakini haizingatii usimbaji wa hifadhidata na uchujaji unaweza kupitwa. Sitanakili maandishi ya mwandishi aliyeelezea udhaifu huu na nitampa kiungo Chris Shiflett (unaweza kutafuta tafsiri katika RuNet).

Tumia mysql_escape_string au mysql_real_escape_string kazi, mfano:
$input_text = mysql_escape_string($_GET["input_text"]);
Ikiwa hutarajii kuingizwa kwa vitambulisho vya html, basi ni bora kufanya uchujaji ufuatao:
$input_text = strip_tags($_GET["input_text"]); $input_text = htmlspecialchars($input_text); $input_text = mysql_escape_string($input_text);
strip_tags - huondoa vitambulisho vya html.
htmlspecialchars - hubadilisha maalum. herufi katika vyombo vya html.
Kwa njia hii utajikinga na mashambulizi ya XSS, pamoja na sindano ya SQL.
Ikiwa unahitaji vitambulisho vya html, lakini ili kuonyesha tu msimbo wa chanzo, basi tumia tu:
$input_text = htmlspecialchars($_GET["input_text"]); $input_text = mysql_escape_string($input_text);

Ikiwa ni muhimu kwako kwamba thamani ya kutofautisha sio tupu, basi tumia kazi ya trim, kwa mfano:
$input_text = trim($_GET["input_text"]); $input_text = htmlspecialchars($input_text); $input_text = mysql_escape_string($input_text);

Uchujaji. Kosa #3.
Inahusu kutafuta katika hifadhidata.
Ili kutafuta kwa nambari, tumia uchujaji ulioelezewa katika kosa la kwanza.
Ili kutafuta kwa maandishi, tumia uchujaji ulioelezewa katika kosa la pili, lakini kwa kutoridhishwa.
Ili mtumiaji asiweze kufanya kosa la kimantiki, ni muhimu kuondoa au skrini maalum. Wahusika wa SQL.
Mfano bila nyongeza usindikaji wa kamba:
$input_text = htmlspecialchars($_GET["input_text"]); // Tafuta: "%" $input_text = mysql_escape_string($input_text);
Pato litakuwa swali kama:
... WHERE text_rows KAMA "%".$input_text."%" ... // WAPI text_row LIKE "%%%"
Hii itaongeza kwa kiasi kikubwa mzigo kwenye msingi.
Katika hati yangu, mimi hutumia kazi ambayo huondoa herufi ambazo sitaki kutoka kwa utaftaji:
kazi strip_data($text) ( $quotes = safu ("\x27", "\x22", "\x60", "\t", "\n", "\r", "*", "%", "<", ">", "?", "!"); $goodquotes = safu ("-", "+", "#"); $repquotes = safu ("\-", "\+", "\#"); $text = trim(strip_tags($text)); $text = str_replace($quotes, "", $text = str_replace($goodquotes, $text = ereg_replace(" +) , " ", $text);
Kwa kweli, sio wahusika wote hapo juu ni hatari, lakini kwa upande wangu hawahitajiki, kwa hivyo ninatafuta na kuchukua nafasi.
Mfano wa kutumia kuchuja:
$input_text = strip_data($_GET["input_text"]); $input_text = htmlspecialchars($input_text); $input_text = mysql_escape_string($input_text);
Ninakushauri pia kupunguza idadi ya wahusika kwenye utaftaji, angalau 3, kwa sababu ... ikiwa una idadi kubwa ya rekodi kwenye hifadhidata, basi kutafuta wahusika 1-2 kutaongeza mzigo kwenye hifadhidata.
Uchujaji. Kosa #4.
Thamani katika kutofautisha hazichujwa $_KUKU. Watu wengine wanafikiri kwamba kwa kuwa tofauti hii haiwezi kupitishwa kupitia fomu, basi hii ni dhamana ya usalama.
Tofauti hii ni rahisi sana kughushi kwa kivinjari chochote kwa kuhariri vidakuzi vya tovuti.
Kwa mfano, katika CMS moja inayojulikana kulikuwa na hundi ya kiolezo cha tovuti kilichotumiwa:
ikiwa (@is_dir (MAIN_DIR . "/template/" . $_COOKIE["skin"]))( $config["skin"] = $_COOKIE["ngozi"]; ) $tpl->dir = MAIN_DIR . "/template/". $config["ngozi"];
Katika kesi hii, unaweza kuchukua nafasi ya thamani ya kutofautiana $_COOKIE["ngozi"] na kusababisha kosa ambapo utaona njia kamili ya folda ya tovuti.
Ikiwa unatumia thamani ya kuki kuhifadhi kwenye hifadhidata, kisha tumia mojawapo ya uchujaji ulioelezwa hapo juu, hii inatumika pia kwa kutofautiana. $_SERVER.
Uchujaji. Kosa #5.
Maelekezo pamoja sajili_ulimwengu. Hakikisha umeizima ikiwa imewashwa.
Katika hali zingine, unaweza kupitisha thamani ya kutofautisha ambayo haikupaswa kupitishwa, kwa mfano, ikiwa tovuti ina vikundi, basi kwa kikundi cha 2 utofauti wa kikundi cha $ unapaswa kuwa tupu au sawa na 0, lakini inatosha kuwa bandia. fomu kwa kuongeza nambari:

Katika muundo wa hati ya PHP $group itakuwa sawa na 5 ikiwa haikutangazwa kwenye hati yenye thamani chaguomsingi.
Uchujaji. Kosa #6.
Angalia faili zako zilizopakuliwa.
Angalia pointi zifuatazo:
  1. Ugani wa faili. Inashauriwa kuzuia kupakua faili na viendelezi: php, php3, php4, php5, nk.
  2. Je, faili iliyopakiwa kwenye seva move_uploaded_file
  3. ukubwa wa faili
Uchunguzi. Kosa namba 1.
Nilikutana na kesi wakati ombi la AJAX (kwa mfano: kuongeza sifa) jina la mtumiaji au kitambulisho kilipitishwa (ambaye sifa ilikuwa ikiongezeka), lakini katika PHP yenyewe hapakuwa na hundi ya kuwepo kwa mtumiaji kama huyo.
Kwa mfano:
$user_id = intval($_REQUEST["user_id"]); ... INGIZA KWENYE REPLOG SET uid = "($user_id)", plus = "1" ... ... USASISHA Watumiaji WEKA reputation = reputation+1 WHERE user_id = "($user_id)" ...
Inabadilika kuwa tunaunda kiingilio kwenye hifadhidata ambacho hakina maana kabisa kwetu.
Uchunguzi. Kosa namba 2.
Wakati wa kufanya aina mbalimbali za vitendo (kuongeza, kuhariri, kufuta) na data, usisahau kuangalia haki za mtumiaji kufikia kazi hii na vipengele vya ziada (kwa kutumia lebo za html au uwezo wa kuchapisha nyenzo bila uthibitishaji).

Muda mrefu uliopita nilirekebisha kosa kama hilo katika moduli moja ya jukwaa, wakati mtumiaji yeyote angeweza kuhariri ujumbe kwa utawala.

Uchunguzi. Kosa #3.
Unapotumia faili nyingi za php, fanya ukaguzi rahisi.
Katika faili index.php(au katika faili nyingine yoyote kuu) andika laini ifuatayo kabla ya kuunganisha faili zingine za php:
fafanua("READFILE", kweli);
Mwanzoni mwa faili zingine za php andika:
ikiwa (! imefafanuliwa ("READFILE")) ( toka ("Kosa, njia mbaya ya faili.
Nenda kwa kuu."); }
Hii itazuia ufikiaji wa faili.
Uchunguzi. Kosa #4.
Tumia heshi kwa watumiaji. Hii itasaidia kuzuia hii au kazi hiyo kuitwa kupitia XSS.
Mfano wa kuandaa heshi kwa watumiaji:
$secret_key = md5(strtolower("http://site.ru/" . $member["name"] . sha1($password) . tarehe("Ymd")); // $secret_key ni heshi yetu
Ifuatayo, katika aina zote muhimu, badilisha ingizo na thamani ya heshi ya sasa ya mtumiaji:

Wakati wa kuendesha hati, angalia:
ikiwa ($_POST["secret_key"] !== $secret_key) ( toka ("Error: secret_key!"); )
Uchunguzi. Kosa #5.
Wakati wa kutoa makosa ya SQL, weka kizuizi rahisi cha ufikiaji wa habari. Kwa mfano, weka nenosiri la tofauti ya GET:
ikiwa ($_GET["passsql"] == "nenosiri") ( ... pato la kosa la SQL... ) lingine ( ... Taarifa tu kuhusu hitilafu, hakuna maelezo... )
Hii itakuruhusu kuficha habari kutoka kwa mdukuzi ambayo inaweza kumsaidia hack tovuti.
Uchunguzi. Kosa #5.
Jaribu kutojumuisha faili kwa kupata majina ya faili kutoka nje.
Kwa mfano:
ikiwa (isset($_GET["file_name"])) (jumuisha $_GET["file_name"] .".php";)
Tumia swichi