Sinusuri ng Php para sa variable na pag-iral. Tanong: Paano suriin kung mayroong isang variable

Gusto kong suriin kung mayroong isang variable. Ngayon gumagawa ako ng ganito:

Subukan ang: myVar maliban sa NameError: # Gumawa ng isang bagay.

Mayroon bang iba pang mga paraan nang walang mga pagbubukod?


2018-05-09 13:10

Mga sagot:

Upang suriin ang pagkakaroon ng isang lokal na variable:

Kung ang "myVar" sa locals(): # myVar ay umiiral.

Upang suriin ang pagkakaroon ng isang pandaigdigang variable:

Kung ang "myVar" sa globals(): # myVar ay umiiral.

Upang suriin kung ang isang bagay ay may katangian:

Kung hasattr(obj, "attr_name"): # obj.attr_name ay umiiral.


2018-05-09 13:16

Ang paggamit ng mga variable na hindi pa tinukoy o itinakda (implicitly o tahasang) ay halos palaging masama Anuman dahil ito ay nagpapahiwatig na ang lohika ng programa ay hindi pinag-isipan nang maayos at malamang na magreresulta sa hindi mahuhulaan na pag-uugali.

Ang susunod na trick, na katulad ng sa iyo, ay titiyakin na mayroon ang variable ilang halaga bago gamitin:

Subukan ang: myVar maliban sa NameError: myVar = Wala # Ngayon ay malaya ka nang gumamit ng myVar nang hindi nagrereklamo si Python.

Gayunpaman, hindi ko pa rin iniisip na ito ay isang magandang ideya - sa aking opinyon, dapat mong i-refactor ang iyong code upang maiwasang mangyari ang sitwasyong ito.


2018-05-09 13:19

Ang paggamit ng try / except ay ang pinakamahusay na paraan upang suriin ang pagkakaroon ng isang variable. Ngunit may halos tiyak na isang mas mahusay na paraan upang gawin kung ano ang iyong ginagawa kaysa sa pagtatakda/pagsubok ng mga pandaigdigang variable.

Halimbawa, kung gusto mong magpasimula ng variable na antas ng module sa unang pagkakataong tinawag ang ilang function, mas makabubuti sa iyo na gumamit ng code na tulad nito:

My_variable = None def InitMyVariable(): global my_variable kung my_variable ay Wala: my_variable = ...


2018-05-09 13:27

para sa mga bagay/module, maaari mo rin

"var" sa dir(obj)

Halimbawa,

>>> klase Something(object): ... pass ... >>> c = Something() >>> c.a = 1 >>> "a" in dir(c) True >>> "b" in dir (c) Mali


2017-10-28 18:39

Ang isang madaling paraan ay ang simulan muna ito gamit ang myVar = Wala

Pagkatapos ay mamaya:

Kung ang myVar ay hindi Wala: # Gumawa ng isang bagay


2018-06-04 18:46

Sa palagay ko ang pagsubok ay gagamitin sa isang function na katulad ng sagot ng user97370 Hindi ko gusto ang sagot na ito dahil ito ay nagpaparumi sa pandaigdigang namespace. Ang isang paraan upang ayusin ito ay ang paggamit ng isang klase sa halip:

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

Hindi ko gusto ito dahil pinapalubha nito ang code at nagbubukas ng mga tanong tulad ng kung pinapatunayan nito ang pattern ng programming ng Singleton? Sa kabutihang-palad, pinahintulutan ng Python ang mga function na magkaroon ng mga katangian nang ilang sandali, na nagbibigay sa amin ng simpleng solusyon na ito:

Def InitMyVariable(): kung Ang InitMyVariable.my_variable ay Wala: InitMyVariable.my_variable = ... InitMyVariable.my_variable = Wala


2018-03-25 20:31

2018-05-09 13:12

Ang isang paraan na madalas na gumagana nang maayos para sa paghawak ng ganitong uri ng sitwasyon ay ang hindi tahasang suriin kung umiiral ang variable ngunit ituloy lang at i-wrap ang unang paggamit ng posibleng hindi umiiral na variable sa isang pagsubok/maliban sa NameError.

null function (11)

Mayroon akong (o wala) isang $_GET["myvar"] na variable na nagmumula sa aking query string at gusto kong suriin kung umiiral ang variable na iyon at kung ang halaga ay tumutugma sa isang bagay sa loob ng aking if statement:

Ang ginagawa at iniisip ko ay hindi ang pinakamahusay na paraan upang gawin:

if(isset($_GET["myvar"]) && $_GET["myvar"] == "something") : gumawa ng isang bagay

Ito ay isang simpleng kaso, ngunit isipin na kailangan mong ihambing ang marami sa mga $myvar variable na ito.

Mga sagot

Ito ay katulad ng tinanggap na sagot, ngunit gumagamit ng in_array sa halip. Mas gusto kong gumamit ng empty() sa sitwasyong ito. Iminumungkahi ko rin ang paggamit ng bagong string array declaration na available sa PHP 5.4.0+.

$allowed = ["something","nothing"]; if(!empty($_GET["myvar"]) && in_array($_GET["myvar"],$allowed))(..)

Narito ang isang function upang suriin ang maramihang mga halaga nang sabay-sabay.

$arrKeys = array_keys($_GET); $allowed = ["something","nothing"]; function checkGet($arrKeys,$allowed) ( foreach($arrKeys as $key) ( if(in_array($_GET[$key],$allowed)) ( $values[$key]; ) ) return $values; )

Ginagamit ko ang lahat ng aking sariling kapaki-pakinabang na function exst(), na awtomatikong nagdedeklara ng mga variable.

$element1 = exst($arr["key1"]); $val2 = exst($_POST["key2"], "novalue"); /** * Function exst() - Sinusuri kung naitakda na ang variable * (kopyahin/idikit ito sa anumang lugar ng iyong code) * * Kung nakatakda ang variable at hindi walang laman, ibabalik ang variable (walang pagbabago) * Kung ang variable ay hindi nakatakda o walang laman, ibinabalik ang $default na halaga * * @param mixed $var * @param mixed $default * * @return mixed */ function exst(& $var, $default = "") ( $t = "" ; kung (!isset($var) || !$var) ( kung (isset($default) && $default != "") $t = $default; ) else ( $t = $var; ) kung (is_string ($t)) $t = trim($t);

Kaya, maaari kang makayanan gamit lamang ang if($_GET["myvar"] == "something") dahil ipinapalagay ng kundisyong iyon na umiiral din ang variable. Kung hindi, ang expression ay magreresulta din sa false .

Sa tingin ko, ok lang na gawin ito sa mga kondisyon tulad ng nasa itaas. No harm talaga.

Ang tanong ko ay: mayroon bang paraan upang gawin ito nang hindi idineklara ang variable nang dalawang beses?

Hindi, walang paraan upang gawin ito nang tama nang hindi gumagawa ng dalawang pagsusuri. Ayaw ko rin.

Ang isang paraan upang makayanan ito ay ang pag-import ng lahat ng nauugnay na variable ng GET sa isang gitnang punto sa isang array o object ng ilang uri (awtomatikong ginagawa ito ng karamihan sa mga MVC) at itakda ang lahat ng mga katangian na kinakailangan sa ibang pagkakataon. (Sa halip na i-access ang mga variable ng query sa pamamagitan ng code.)

If (isset($_GET["myvar"]) == "something")

Salamat sa Mellowsoon at Pekka, nag-research ako dito at naisip ko ito:

  • Suriin at ideklara ang bawat variable bilang null (kung gayon) bago ito gamitin (tulad ng inirerekomenda):
!isset($_GET["myvar"]) ? $_GET["myvar"] = 0:0;

*ok, ito ay simple ngunit mahusay na gumagana, maaari mong simulan ang paggamit ng variable saanman pagkatapos ng linyang ito

  • Paggamit ng array para sa lahat ng kaso:
$myvars = array("var1", "var2", "var3"); foreach($myvars bilang $key) !isset($_GET[$key]) ? $_GET[$key] =0:0;

*pagkatapos nito maaari mong gamitin ang iyong mga variable (var1, var2, var3... atbp.)

PS: isang function na tumatanggap ng JSON object ay dapat na mas mahusay (o isang simpleng burst/explosion delimited string);

Ang mas mahusay na mga diskarte ay malugod :)

I-UPDATE:

Gumamit ng $_REQUEST sa halip na $_GET, sa ganitong paraan sinasaklaw mo ang mga variable na $_GET at $_POST.

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

Ang solusyon na nakita ko mula sa laro ay gawin:

If($x=&$_GET["myvar"] == "something") ( // gumawa ng mga bagay gamit ang $x )

Bilang pahiwatig, maaari mong isaalang-alang ang diskarteng ito:

Kinakailangan = array("myvar" => "defaultValue1", "foo" => "value2", "bar" => "value3", "baz" => "value4"); $missing = array_diff ($required, array_keys ($_GET)); foreach($nawawala bilang $key => $default) ( $_GET[$key] = $default ; )

Itinakda mo ang mga default na halaga at itinakda ang hindi natanggap na mga parameter sa default na halaga :)

Sa kasamaang palad, ito ang tanging paraan upang gawin ito. Ngunit may mga diskarte sa pagtatrabaho sa malalaking array. Halimbawa, tulad nito:

$required = array("myvar", "foo", "bar", "baz"); $nawawala = array_diff($kinakailangan, array_keys($_GET));

Ang $missing variable ay naglalaman na ngayon ng isang listahan ng mga value na kinakailangan ngunit nawawala sa $_GET array. Maaari mong gamitin ang $missing array upang magpakita ng mensahe sa bisita.

O maaari kang gumamit ng isang bagay tulad nito:

$required = array("myvar", "foo", "bar", "baz"); $missing = array_diff ($required, array_keys ($_GET)); foreach($nawawala bilang $m) ($_GET[$m] = null; )

Ngayon ang bawat kinakailangang elemento ay may default na halaga bilang default. Magagamit mo na ngayon ang if ($_GET["myvar"] == "something") nang hindi nababahala tungkol sa hindi naitakdang susi.

Update

Ang isa pang paraan upang linisin ang code ay ang paggamit ng isang function na nagsusuri kung ang halaga ay nakatakda.

Function getValue($key) ( if (!isset($_GET[$key])) ( return false; ) return $_GET[$key]; ) if (getValue("myvar") == "something") ( / / Gumawa ng isang bagay)

bakit hindi lumikha ng isang function para dito, i-convert ang variable na gusto mong suriin sa isang tunay na variable, hal.

Function _FX($name) ( if (isset ($$name)) ibalik ang $$name; else return null; )

tapos gagawin mo _FX("param") == "123" , isang pag-iisip lang

Nakakita ako ng (maraming) mas mahusay na code upang gawin ito kung gusto mong subukan ang isang bagay sa .

Kung [[ $1 = "" ]] pagkatapos ay echo ang "$1 ay blangko" kung hindi, echo ang "$1 ay napuno" fi

Bakit lahat ng ito? Ang lahat ng nasa ay umiiral sa Bash, ngunit ito ay walang laman bilang default, kaya ang test -z at test -n ay hindi makakatulong sa iyo.

Kung [ $(#1) = 0 ] pagkatapos ay echo ang "$1 ay blangko" kung hindi, echo ang "$1 ay napuno" fi

Maaari mong suriin kung ang isang naibigay na variable ay umiiral (iyon ay, ito ay nasimulan o hindi). Upang gawin ito, gamitin ang function:

Isset(variable);

Kung ang variable ay kasalukuyang hindi umiiral (hindi pa ito naitatalaga ng isang halaga kahit saan bago o ito ay tinanggal ng function hindi nakatakda () ), pagkatapos ay ang function isset () nagbabalik mali , kung hindi - totoo :

$x = 5;

kung (isset($x))

echo ‘< BR > Variable $ x umiiral, ', "ang halaga nito ay $ x < BR >”;

Ang mga sumusunod ay lilitaw sa screen:

Variable $ x umiiral, ang halaga nito ay 5

Mahalagang tandaan na hindi tayo maaaring gumamit ng hindi nasimulang variable sa programa - bubuo ito ng babala mula sa interpreter PHP .

Upang malaman kung ang isang halaga ay isang variable walang laman , ang function ay ginagamit:

walang laman( variable);

Kung ang halaga ng variable ay sero ,“0”, NULL , walang laman na linya (“” ), false, ang variable ay hindi ipinahayag o ay walang laman na hanay , pagkatapos ay bumalik ang function na ito totoo , kung hindi - mali .

Upang suriin uri variable, ginagamit ang mga function:

Is_string(variable);

ay _ int (variable);

ay _ lumutang (variable);

ay _ null (variable);

ay _ array (variable);

ay _ numeric (variable); - kung ang variable ay numeric ( integer , lumutang ) o isang string na naglalaman lamang ng mga numero.

Bumalik ang mga function na ito totoo kung ang variable ay nasa tinukoy na uri.

Output ng data

Hindi na-format na output

Walang format Ang output ng mga string o variable na halaga ay isinasagawa ng function:

echo listahan ng mga variable;

echo linya;

saan listahan ng mga variable – mga pangalan ng mga variable ng output na pinaghihiwalay ng mga kuwit.

Kung nagtatrabaho kami sa isang web browser, ididirekta ng function na ito ang output sa bahagi ng kliyente ng browser (sa window nito).

Tulad ng nasabi na, kung ang mga variable na pangalan ay matatagpuan sa isang string na nakapaloob sa mga dobleng panipi, kung gayon ang mga katumbas na halaga ay ipinapakita sa screen sa halip na mga pangalang ito. Bukod dito, kung ang naturang linya ay naglalaman ng mga tag HTML (mga hawakan na nakapaloob sa mga anggulong bracket), pagkatapos ay ipapakita ito ng browser HTML -code na dapat gawin kapag binibigyang kahulugan HTML -dokumento:

$taon = 2012;

$mensahe = “ Wish lahat kaligayahan !”;

echo"

Aking binabati kita !

”;

echo" Dumating $taon taon !
$mensahe
”;

?>

Ang pamagat ng antas ay ipapakita sa screen H 3 at isang kasunod na pagbati, na may salitang “ kaligayahan!" ay ipapakita sa bold italic:

Binabati kita!

2012 na! Wish ko lahat kaligayahan!

Sa ganitong paraan makakagawa ka ng mga dynamic na site.

Naka-format na output

Naka-format pinapayagan ka ng output na kumatawan sa mga ipinapakitang numero sa iba't ibang mga sistema ng numero, at sa decimal system - sa iba't ibang anyo ( mga format ). Ito ay katulad ng na-format na output sa Si at isinasagawa ng mga function:

printf ("format", listahan ng output);

sprintf ("format", listahan ng output);

Ang unang function ay nagpapakita ng naka-format na data sa browser window at ibinabalik ang dami nito.

Ang pangalawang function ay nagfo-format lamang ng output data, ngunit hindi ito naglalabas.

Format ay isang sequence ng transformation descriptors para sa mga output value.

Deskriptor ng Pagbabago para sa bawat halaga ay may anyo:

% PlaceholderAlignmentLength.AccuracyType

- Pinagsama-sama ay ang simbolo na gagamitin upang makumpleto ang resulta ng pagbabago sa ibinigay na halaga haba (default - espasyo ); kung ito ay isa pang karakter, pagkatapos ito ay pinangungunahan ng isang solong quote ( kudlit ),

- Pag-align – bilang default – sa pamamagitan ng tama gilid ng patlang ng output; kung may minus ( - ), pagkatapos ay sa pamamagitan ng umalis ,

- Ang haba – lapad ng field ng output - ang bilang ng mga puwang na inilaan para sa pag-output ng halagang ito. Kung ang output value ay naglalaman ng mas kaunting mga character kaysa sa tinukoy na halaga haba , pagkatapos ay mapupuno ang natitirang espasyo mga espasyo o padding character,

- Katumpakan – ang bilang ng mga decimal na lugar sa fractional na bahagi ng numero,

- Uri – uri ng halaga ng output:

b binary ,

Sa simbolo ,

d buo sa sistema ng decimal na numero,

e totoo sa exponential form (floating point),

f totoo sa fixed point form,

s linya ,

O buo sa octal number system,

x buo sa hexadecimal number system.

Halimbawa:

php

$ zarp _1 = 6543.21;

$ zarp _2 = 45321.67;

$ pamilya _1 = "Balaganov";

$ pamilya _2 = "Bender";

printf ("< H 1> Payroll h 1>");

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

echo"
";

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

echo"
";

?>

Ang punto ( ‘. ). Ang mga apelyido ay iniwang nakahanay ( - ) sa isang lapad ng field 12 mga karakter. Ang mga numero ay kinakatawan sa fixed point form sa isang lapad ng field 10 mga character at may katumpakan 2 mga decimal na lugar, naka-align sa kanan.

Ang materyal ay pangunahing inilaan para sa mga baguhan na web programmer.

Panimula.

Kadalasan ay nilalapitan ako ng mga kliyente na nag-install ng self-written na CMS o mga module na isinulat ng mga baguhang web programmer na hindi nauunawaan kung ano ang kinakailangan upang maprotektahan ang data at madalas na kinokopya ang mga function ng pag-filter nang hindi iniisip kung paano gumagana ang mga ito at kung ano ang eksaktong kailangang gawin sa kanila. .

Dito ay susubukan kong ilarawan sa mas maraming detalye hangga't maaari ang mga karaniwang pagkakamali kapag nag-filter ng data sa isang script ng PHP at magbigay ng mga simpleng tip kung paano i-filter nang tama ang data.

Maraming mga artikulo sa Internet tungkol sa pag-filter ng data, ngunit hindi sila kumpleto at walang mga detalyadong halimbawa.

Debriefing.

Pagsala. Pagkakamali #1
Para sa mga variable na numero ang sumusunod na tseke ay ginagamit:
$number = $_GET["input_number"]; if (intval($number)) ( ... isagawa ang SQL query... )
Bakit ito hahantong sa SQL injection? Ang punto ay maaaring tukuyin ng user sa variable input_number ibig sabihin:
1"+UNION+SELECT
Sa ganitong mga kaso, matagumpay na makukumpleto ang tseke, dahil nakukuha ng intval function ang integer value ng isang variable, i.e. 1, ngunit sa variable mismo $number walang nagbago, kaya lahat ng malisyosong code ay ipapasa sa SQL query.
Tamang pag-filter:
$number = intval($_GET["input_number"]); kung ($number) ( ... execute SQL query... )
Siyempre, maaaring magbago ang kundisyon, halimbawa kung kailangan mo lang makakuha ng isang partikular na hanay:
kung ($number >= 32 AT $number<= 65)

Kung gumagamit ka ng mga checkbox o multiselect na may mga numerong halaga, gawin ang sumusunod na pagsusuri:
$checkbox_arr = array_map("intval", $_POST["checkbox"]);
array_map
Nakikita ko rin ang pag-filter sa form:
$number = htmlspecialchars(intval($_GET["input_number"]));
htmlspecialchars
O kaya:
$number = mysql_escape_string(intval($_GET["input_number"]));
mysql_escape_string

Wala itong maidudulot kundi isang ngiti :)

Pagsala. Pagkakamali #2.
Para sa mga variable ng string, ginagamit ang sumusunod na pag-filter:
$input_text = addslashes($_GET["input_text"]);
Ang addslashes function ay lumalabas sa espesyal. mga character, ngunit hindi nito isinasaalang-alang ang pag-encode at pag-filter ng database ay maaaring ma-bypass. Hindi ko kokopyahin ang teksto ng may-akda na naglalarawan sa kahinaan na ito at magbibigay lang ng link kay Chris Shiflett (maaari kang maghanap para sa pagsasalin sa RuNet).

Gamitin ang mysql_escape_string o mysql_real_escape_string function, halimbawa:
$input_text = mysql_escape_string($_GET["input_text"]);
Kung hindi mo inaasahan ang pagsasama ng mga html tag, kung gayon ito ay pinakamahusay na gawin ang sumusunod na pag-filter:
$input_text = strip_tags($_GET["input_text"]); $input_text = htmlspecialchars($input_text); $input_text = mysql_escape_string($input_text);
strip_tags - nag-aalis ng mga html tag.
htmlspecialchars - nagko-convert ng mga espesyal. mga character sa html entity.
Sa ganitong paraan mapoprotektahan mo ang iyong sarili mula sa mga pag-atake ng XSS, bilang karagdagan sa SQL injection.
Kung kailangan mo ng mga html tag, ngunit para lamang ipakita ang source code, pagkatapos ay gamitin lamang ang:
$input_text = htmlspecialchars($_GET["input_text"]); $input_text = mysql_escape_string($input_text);

Kung mahalaga para sa iyo na ang halaga ng variable ay walang laman, pagkatapos ay gamitin ang trim function, halimbawa:
$input_text = trim($_GET["input_text"]); $input_text = htmlspecialchars($input_text); $input_text = mysql_escape_string($input_text);

Pagsala. Pagkakamali #3.
May kinalaman ito sa paghahanap sa database.
Upang maghanap ayon sa mga numero, gamitin ang pag-filter na inilarawan sa unang error.
Upang maghanap sa pamamagitan ng text, gamitin ang pag-filter na inilarawan sa pangalawang error, ngunit may mga reserbasyon.
Upang ang user ay hindi makapagsagawa ng isang lohikal na error, ito ay kinakailangan upang alisin o i-screen ang espesyal. Mga character ng SQL.
Halimbawa nang walang karagdagang pagproseso ng string:
$input_text = htmlspecialchars($_GET["input_text"]); // Paghahanap: "%" $input_text = mysql_escape_string($input_text);
Ang output ay magiging isang query tulad ng:
... WHERE text_row LIKE "%".$input_text."%" ... // WHERE text_row LIKE "%%%"
Ito ay makabuluhang tataas ang pagkarga sa base.
Sa aking script, gumagamit ako ng isang function na nag-aalis ng mga character na hindi ko gusto mula sa paghahanap:
function strip_data($text) ($ quotes = array ("\x27", "\x22", "\x60", "\t", "\n", "\r", "*", "%", "<", ">", "?", "!"); $goodquotes = array ("-", "+", "#"); $repquotes = array ("\-", "\+", "\#"); $text = trim(strip_tags($text)); $text = str_replace($quotes, "", $text = str_replace($goodquotes, $repquotes, $text = ereg_replace(" +"); , " ", $text);
Siyempre, hindi lahat ng mga character sa itaas ay mapanganib, ngunit sa aking kaso hindi sila kailangan, kaya nagsasagawa ako ng paghahanap at pagpapalit.
Halimbawa ng paggamit ng pag-filter:
$input_text = strip_data($_GET["input_text"]); $input_text = htmlspecialchars($input_text); $input_text = mysql_escape_string($input_text);
Pinapayuhan ko rin kayong magtakda ng limitasyon sa bilang ng mga character sa paghahanap, hindi bababa sa 3, dahil... kung mayroon kang isang malaking bilang ng mga tala sa database, kung gayon ang paghahanap para sa 1-2 mga character ay makabuluhang tataas ang pagkarga sa database.
Pagsala. Pagkakamali #4.
Ang mga halaga sa variable ay hindi na-filter $_COOKIE. Ang ilang mga tao ay nag-iisip na dahil ang variable na ito ay hindi maipapasa sa form, ito ay isang garantiya ng seguridad.
Ang variable na ito ay napakadaling pekein sa anumang browser sa pamamagitan ng pag-edit ng cookies ng site.
Halimbawa, sa isang kilalang CMS mayroong isang tseke ng template ng site na ginamit:
kung (@is_dir (MAIN_DIR . "/template/" . $_COOKIE["skin"]))( $config["skin"] = $_COOKIE["skin"]; ) $tpl->dir = MAIN_DIR . "/template/" . $config["balat"];
Sa kasong ito, maaari mong palitan ang halaga ng variable $_COOKIE["balat"] at magdulot ng error kung saan makikita mo ang ganap na landas sa folder ng site.
Kung gagamitin mo ang halaga ng cookie upang i-save sa database, pagkatapos ay gumamit ng isa sa pag-filter na inilarawan sa itaas, nalalapat din ito sa variable $_SERVER.
Pagsala. Pagkakamali #5.
Kasama ang direktiba register_globals. Tiyaking i-off ito kung naka-on ito.
Sa ilang mga sitwasyon, maaari mong ipasa ang halaga ng isang variable na hindi dapat naipasa, halimbawa, kung ang site ay may mga pangkat, kung gayon para sa pangkat 2 ang $group variable ay dapat na walang laman o katumbas ng 0, ngunit ito ay sapat na upang pekein ang form sa pamamagitan ng pagdaragdag ng code:

Sa isang PHP script variable $grupo ay magiging katumbas ng 5 kung hindi ito idineklara sa script na may default na halaga.
Pagsala. Pagkakamali #6.
Suriin ang iyong mga na-download na file.
Suriin ang mga sumusunod na punto:
  1. Extension ng file. Maipapayo na ipagbawal ang pag-download ng mga file na may mga extension: php, php3, php4, php5, atbp.
  2. Ang file ba ay na-upload sa server move_uploaded_file
  3. Laki ng file
Pagsusulit. Pagkakamali #1.
Nakatagpo ako ng mga kaso kapag para sa isang kahilingan sa AJAX (halimbawa: pagtaas ng reputasyon) ang pangalan o ID ng user ay naipasa (kung kanino tumataas ang reputasyon), ngunit sa PHP mismo ay walang pagsusuri para sa pagkakaroon ng naturang user.
Halimbawa:
$user_id = intval($_REQUEST["user_id"]); ... INSERT INTO REPLOG SET uid = "($user_id)", plus = "1" ... ... I-UPDATE ang Mga User SET reputation = reputation+1 WHERE user_id = "($user_id)" ...
Lumalabas na gumagawa kami ng isang entry sa database na ganap na walang silbi sa amin.
Pagsusulit. Pagkakamali #2.
Kapag nagsasagawa ng iba't ibang uri ng mga aksyon (pagdaragdag, pag-edit, pagtanggal) gamit ang data, huwag kalimutang suriin ang mga karapatan ng gumagamit na ma-access ang function na ito at mga karagdagang tampok (gamit ang mga html tag o ang kakayahang mag-publish ng materyal nang walang pag-verify).

Matagal na ang nakalipas naitama ko ang isang katulad na error sa isang module ng forum, kapag ang sinumang gumagamit ay maaaring mag-edit ng isang mensahe sa administrasyon.

Pagsusulit. Pagkakamali #3.
Kapag gumagamit ng maramihang mga php file, gawin ang isang simpleng pagsusuri.
Nasa file index.php(o sa anumang iba pang pangunahing file) isulat ang sumusunod na linya bago ikonekta ang iba pang mga php file:
define("READFILE", true);
Sa simula ng iba pang mga php file, isulat ang:
kung (! tinukoy ("READFILE")) ( lumabas ("Error, maling paraan ng pag-file.
Pumunta sa main."); }
Hihigpitan nito ang pag-access sa mga file.
Pagsusulit. Pagkakamali #4.
Gumamit ng mga hash para sa mga user. Makakatulong ito na pigilan ito o ang function na iyon na tawagin sa pamamagitan ng XSS.
Isang halimbawa ng pag-compile ng hash para sa mga user:
$secret_key = md5(strtolower("http://site.ru/" . $member["name"] . sha1($password) . date("Ymd"))); // $secret_key ang aming hash
Susunod, sa lahat ng mahahalagang anyo, palitan ang input ng halaga ng kasalukuyang hash ng user:

Habang pinapatakbo ang script, suriin:
kung ($_POST["secret_key"] !== $secret_key) ( exit ("Error: secret_key!"); )
Pagsusulit. Pagkakamali #5.
Kapag nag-output ng mga error sa SQL, gumawa ng simpleng paghihigpit sa pag-access sa impormasyon. Halimbawa, itakda ang password para sa GET variable:
if ($_GET["passsql"] == "password") ( ... SQL error output... ) else ( ... Impormasyon lang tungkol sa error, walang detalye... )
Ito ay magbibigay-daan sa iyo upang itago ang impormasyon mula sa hacker na maaaring makatulong sa kanya hack ang site.
Pagsusulit. Pagkakamali #5.
Subukang huwag isama ang mga file sa pamamagitan ng pagkuha ng mga pangalan ng file mula sa labas.
Halimbawa:
if (isset($_GET["file_name"])) ( isama ang $_GET["file_name"] .".php"; )
Gamitin ang switch