web.hc.lv - vortāls tīmekļa veidotājiem: Raksti http://web.hc.lv/kods/php-mysql/?rss=1/ PHP un MySQL - raksti un pamācības lv 2007-2019, web.hc.lv web.hc.lv 60 http://www.hc.lv/inc/baners/hclv_baner_small.gif web.hc.lv - vortāls tīmekļa veidotājiem http://web.hc.lv/ web.hc.lv - vortāls tīmekļa veidotājiem Wed, 18 Sep 2019 05:45:43 +0300 2 3 4 5 6 Skype bots (php, Skype4com) Kods PHP un MySQL Raksti http://web.hc.lv/kods/php-mysql/raksti/skype-bots_5/ http://web.hc.lv/kods/php-mysql/raksti/skype-bots_5/ Fri, 10 Jul 2009 23:31:13 +0300 web.hc.lv - vortāls tīmekļa veidotājiem Lai arī Skype sākotnēji bija paredzēts balss, video un tekstuālai komunikācijai starp diviem vai vairākiem dalībniekiem, apķērīgiem cilvēkiem ar to bija par maz. Līdz pats skype laida klajā COM moduli, caur kuru tad arī var no citas aplikācijas šo to sadarīt Skype.

Kā jau vēsta virsraksts, stāsts būs par to, kā no ārējās aplikācijas (kas šoreiz būs rakstīta iekš PHP) var veikt darbības ar Skype. Darbību klāsts ir visnotaļ iespaidīgs un apskatāms šeit. No visa šī bagātīgā klāsts izmantosim tērzētavas procedūras – ziņojuma sūtīšanu un ziņojuma saņemšanu.

 

php-Skype platforma
Attēls 1. Platforma.

Pielietojums

Tagad abstrahēsimies no tehniskām niansēm (un iespējām) un padomāsim, kur un kā šādu veidojumu varētu izmantot.

  1. Visa sarakste automātiski saglabājas web lapā (blogā, twitterī, utt.)
  2. Tikai ar speciālu komandu tiek pievienots ziņojums web lapai. Piemēram, Pievienot: Pašreiz rakstu par skype4com.
  3. URL labošana. Piemēram: dokuments.doc tiek pārlabots uz //server/user/dokuments.doc, kā rezultātā šī saite kļūs reāla un izmantojama.
  4. Mini Google. Piemēram: google: skype4com un rezultātā tie atsūtīta pirmos 3 ierakstus. Vai pagerank, vai atslēgas vardu pozīcija meklētajā, vai Alexa rank, vai da jebkas cits.
  5. Verķītis pats no sevis ik pa laikam konkrētai konferencei (piem., darbs) tiek izsūtīta īsa informācija – samaksāts rēķins Nr 123 vai šodien vārda dienas svin Jānis Bērziņš un dzimšanas dienu svin Liena Bērziņa.
  6. Vārdnīca. Rakstām, piemēram: en:lullaby atbildē saņemam – lv:šūpļa dziesma
  7. Info serviss. Piemēram: ?cik diskā vietas uz servera. Atbilde 1Gb.
  8. Čatbots. Cik nu labs sanāks... Ja prāta pietiks uztaisīt sakarīgu uz MI balstītu, varētu izrādīties lādzīgs sarunu biedrs
  9. Nu un, protams, čupa ar dažādām cita veida komandām.

Ar ko sākt?

Vispirms vajadzīgs pats Skype ar Skype tīklā reģistrētu lietotāju. Ņemot vērā, ka Skype protokols ir slēgts (t.i. nav publiski apskatāms), visas tālā aprakstītās darbības būs iespējamas, ja būs palaists skype klients (dabūnams gan priekš Windows, gan Linux, gan Mac). Ņemam vērā, ka Skype klientam ir tikai GUI versija...

Otrais. Skype4COM komponente. Principā tas ir dll fails, kuru var piereģistrēt ar regsrv32 komandu. Nesanāca. Līdz ar ko otrs variants. Instalējot izvēlamies Options (pašā pirmajā logā) un atzīmējam "Install Skype Extras Manager". Līdz ar šo, Skype4Com pieinstalēsies. Bet ar to vēl visa maģija nebeidzas.

Skype instalācija

 

Trešais. Izņemot gadījumu, kad PHP tiks darbināts komandrindā (t.i. php –f skype.php), jāsaprot viena lieta – inicializējot savienojumu caur COM objektu, tiks palaista vēl viena Skype instance (ja Skype vēl nav aktīvs) un pieprasīts ievadīt autentifikācijas datus.

Savos eksperimentos izdarīju tā:

  • Palaidu Skype un ielogojos;
  • Pie Administrative Tools > Services > Apache > Properties > Log On un liekam ķeksi pie
    Skype properties
  • Palaižam PHP un atļaujam Skype savienojumu.
    Skype savienojums

Ja PHP neparādīja kaut kādu mistisku COM kļūdu vai Skype4COM unable to attach (Wait Timeout), tad viss strādā, un tālāk jau darbošanās pa PHP!


N.B. Rakstot PHP kodu jāpatur prātā divas lietas:

  1. Jādod laiks izpildīties komandai. Piemēram, izmantojam com_message_pump(4000);
  2. Ja gribam "gaidīt" uz kādu Skype notikumu, piemēram, ienākošo ziņojumu, tad kaut kur sākumā set_time_limit(0); un beigās – bezgalīgo gaidīšanas ciklu:
while(!$sink->terminated) {
  com_message_pump(1000);
}

Mans PHP kods, kurš sūta atbildes ziņojumu uz jebkuru ienākošo ziņojumu.

Dažas labas idejas un reāls Skype bots:
www.voidstar.com/void.bot/source/skypebot.txt

Noderīgas saites:

(Raksts pārpublicēts ar autoru piekrišanu no IINUU bloga.)

]]>
php: require vs require_once Kods PHP un MySQL Raksti http://web.hc.lv/kods/php-mysql/raksti/require-vs-requireonce/ http://web.hc.lv/kods/php-mysql/raksti/require-vs-requireonce/ Thu, 09 Jul 2009 14:25:49 +0300 web.hc.lv - vortāls tīmekļa veidotājiem Esot pamanīts, ka require_once ir līdz pat 4 reizēm lēnāks nekā require.

Domājams, agri vai vēlu veidojot PHP programmiņas rodas vēlme daļu koda glabāt citā failā. Šādā veidā rodas gan koda pārskatāmība, gan loģisko struktūra. Labs jautājums cik smalki sadalīt. Un šeit viennozīmīgas atbildes nav.

include('file.php') – php komanda, kas iekļauj failu file.php. Tas nozīmē, ja failā file.php glabāsies funkcija x(), tā būs pieejama un izmantojama pēc šīs komandas izpildes. Ja fails file.php nav atrasts, tik parādīts warning tipa brīdinājums, savukārt, ja šādā gadījumā nepieciešams "lai pasaule apstājas" lietojam require.

Jo sarežģītāks kods, jo lielāka varbūtība, ka esošās funkcijas būs atkarīga no citām funkcijām, kuras visticamāk glabāsies citos failos. Šādiem gadījumiem, php izdomājuši funkciju include_once('file.php').

function A() { 
  return 123; 
} 

require_once('fails_A.php');
function B() { 
  return A(); 
}

Tad nu, lūk, esot pamanīts, ka require_once() ir līdz pat 4 reizēm lēnāks nekā require(). Googlē atrodami dažādi skaitļi un mērījumi, dažkārt arī pretrunīgi. Vairākkārtēja faila iekļaušana pati par sevi nav laba, jo fails tiek nolasīts un tur esošais kods analizēts un izpildīts.

lv.php.net/manual/en/function.require-once.php#62838
peter.mapledesign.co.uk/weblog/archives/writing-faster-php-code-1-require_once

Gan vienu gan otru procesu var paātrināt, ja izmanto absolūto nevis relatīvo adresi. T.i. require('/var/www/user1/file1.php') nevis require('../../file.php'); Nelielos projektiņos atšķirību var arī nepamanīt, jo izrādās relatīvās adreses kešojas:
us2.php.net/manual/en/ini.core.php#ini.realpath-cache-size


Alternatīvas?

  1. izmantot include() (vai require()) tikai vienreiz;
  2. __autoload() funkcijas izmantošana;
  3. class_exists('myClass') || require('path/to/myClass.class.php');
  4. function_exists('functionInFile') && return; vai class_exists('ClassInFile') && return;
  5. @include('file.php');

Pēdējais – kļūdas apspiešana (error suppression), kā zināms, ir salīdzinoši laikietilpīgs process, bet par to kādā citā rakstā.

www.techyouruniverse.com/software/php-performance-tip-require-versus-require_once

P.S. Es pieminēju, ka statiskās metodes izsaukšana ir ātrāka?

 

Raksts pārpublicēts no IINUU bloga ar autoru piekrišanu.

]]>
Failu augšupielāde ar progresa indikatoru Kods PHP un MySQL Raksti http://web.hc.lv/kods/php-mysql/raksti/failu-augsupielade-ar-progresa-indikatoru/ http://web.hc.lv/kods/php-mysql/raksti/failu-augsupielade-ar-progresa-indikatoru/ Sun, 19 Oct 2008 20:39:18 +0300 web.hc.lv - vortāls tīmekļa veidotājiem Augšupielādējot failu caur HTML formu uz servera sākot ar PHP 5.2 versiju sākot ir iespējams sekot līdzi, cik daudz no faila jau ir ielādējies. Šajā rakstā aprakstīts, kā šo iespēju izmantot praktiski.
Failu augšupielādes progresa indikators

Nepieciešamās priekšzināšanas - HTML, mazliet no PHP un AJAX.

Servera sagatavošana

Sāksim ar to, ka uz servera ar PHP 5.2 ir jābūt pieinstalētam APC jeb Alternative PHP Cache.

Tālāk ir jāpārliecinās, ka ir saliktas pareizas PHP direktīvas php.ini failā (tās var aplūkot ar PHP funkciju phpinfo();):
apc.enabled=on
apc.rfc1867=on
apc.rfc1867_name=APC_UPLOAD_PROGRESS

Jāpārliecinās, kāds ir norādīts maksimālais faila izmērs, kuru var nosūtīt uz serveri ar POST pieprasījumu (šajā gadījumā - 20Mb).
file_uploads=on
post_max_size=20M
upload_max_size=20M

Gadījumā, ja skripts nedarbojas dēļ tā, ka fails augšupielādējas pārāk ilgi, ir vērts apskatīt arī direktīvas max_input_time vērtību.

Faila nosūtīšanas formas sagatavošana

Tālāk izveidojam PHP failu upload.php ar faila augšupielādes formu:
<?php
//nodefinējam unikālu identifikatoru
$id = uniqid('');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="lv" lang="lv">
<head>
<title>Faila augšupielādes forma</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="progress.js" type="text/javascript"></script>
</head>
<body>
<h1>Faila augšupielāde</h1>
<form action="post.php" method="post" enctype="multipart/form-data">
<div>
<input type="hidden" name="APC_UPLOAD_PROGRESS"
value="<?php echo($id) ?>"/>
<input type="hidden" name="MAX_FILE_SIZE" value="20971520"/>
<label for="file">Fails (max izmērs 200 MB): </label>
<input type="file" id="file" name="file"/>
<br />
<label for="apraksts">Apraksts: </label>
<input type="text" id="apraksts" name="apraksts"/>
<br />
<input type="submit" value="Nosūtīt"
onclick="apc_progress('<?php echo($id) ?>');return true;"/>
<div id="apc_progress">&nbsp;</div>
</div>
</form>
</body>
</html>

Uzreiz izstāstīšu, ko kas nozīmē šajā kodā.

HTML taga <form> atribūts enctype="multipart/form-data" norāda uz to, ka ar šīs formas palīdzību tiks sūtīts arī fails.

<input type="hidden" name="MAX_FILE_SIZE" value="20971520"/>
Ar šo rindiņu tiek norādīts, ka maksimālais sūtāmais faila izmērs ir 20971520 baiti (jeb 20 Mb). Patiesībā, pārlūkam pirms sūtīšanas būtu jāpārbauda, vai fails ir lielāks vai mazāks par norādīto izmēru, taču cik meklēju informāciju, tad vismaz Firefox 2.0 un Internet Explorer 6.0 šo iespēju neatbalsta.

<input type="hidden" name="APC_UPLOAD_PROGRESS" value="<?php echo($id) ?>"/>
Šī rindiņa ir tā, kas atbild par faila augšupielādes progresa indikāciju. Atribūta name vērtībai jābūt tādai pašai, kā ir norādīts iekš php.ini apc.rfc1867_name vērtība. Savukārt atribūta value vērtība ir iepriekš ar PHP palīdzību izveidots unikāls identifikators, kas tiks izmantots, lai piekļūtu informācijai par augšupielādējamo failu.

Ļoti būtiski ir atcerēties, ka abām iepriekš aprakstītajām rindiņām jābūt pirms rindiņas šīs rindiņas, kura atbild par to, lai tiktu augšupielādēts fails:
<input type="file" id="file" name="file"/>

Tā kā ar POST pieprasījumu informācija tiek nosūtīta tādā secībā, kādā tā tiek norādīta, tad pretējā gadījumā serveris saņems unikālo faila augšupielādes identifikatoru tikai pēc tam, kad tiks augšupielādēts fails par visiem 100%. Citiem vārdiem sakot, tad, kad tas vairs nebūs vajadzīgs.

<input type="submit" value="Nosūtīt" 
onclick="apc_progress('<?php echo($id) ?>');return true;"/>
Te mēs norādam, ka noklikšķinot uz nosūtīšanas pogu, jāpalaiž javascript funkcija apc_progress() kurai par parametru iedodam iepriekš izveidoto faila unikālo identifikatoru. Tieši šī funkcija būs atbildīga par faila augšupielādes informācijas saņemšanu ar AJAX palīdzību.

Un visbeidzot rindiņa, kuras vietā būs redzams faila augšupielādes progresa indikators:
<div id="apc_progress"></div>

Informācijas par augšupielādējamo failu iegūšana

Izveidojam PHP failu progress.php, kurš nodrošinās AJAX ar nepieciešamo informāciju par to, cik tālu fails ar piešķirto identifikatoru ir augšupielādēts.
<?php
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s").'GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Content-Type: text/html; charset=utf-8');

if(isset($_GET['id']))
{
$status=apc_fetch(('upload_'.$_GET['id']));
echo('Augšupielādēti '.$status['current'].' baiti no '.$status['total'].' baitiem.');
}
?>

Kā redzams, PHP funkcija apc_fetch() ir tā, kas atgriež informāciju masīvā par augšupielādējamo failu, kamēr tas vēl tiek augšupielādēts. Par funkcijas apc_fetch() parametru tiek iedots iepriekš izveidotais faila unikālais identifikators, kuram priekšā ir pielikts prefikss upload_.

Funkcija atgriež masīvu, kura elements ['current'] ir faila pašreizējais augšupielādētais izmērs baitos, bet elements ['total'] - faila kopējais izmērs baitos.

Visa apvienošana kopā ar AJAX palīdzību

Tagad atliek to visu apvienot kopā ar AJAX palīdzību. Izveidojam failu progress.js ar šādu saturu:

//f-ja, kas palaižas nospiežot nosūtīšanas pogu
function apc_progress(nr)
{
//paņemam div elementu, kurā rādīsim progresu
var progdiv=document.getElementById('apc_progress');

//padzēšam div saturu -
//nepieciešams, ja lietotājs nospiež BACK pogu pārlūkā
progdiv.removeChild(progdiv.firstChild);

//parādam tekstu, ka notiek datu ielāde
var txt=document.createTextNode('Lūdzu uzgaidi...');
progdiv.appendChild(txt);

//pēc sekundes palaižam AJAX f-ju, kas saņems datus
setTimeout(('apc("'+nr+'");'),1000)
}

//f-ja, kas parāda saņemto augšupielādes progresu
function update_apc_status(txt2,nr)
{
//paņemam div elementu, kurā rādam progresu
var progdiv=document.getElementById('apc_progress');

//padzēšam div saturu -
progdiv.removeChild(progdiv.firstChild);

//parādam saņemto info par faila ielādes progresu
var txt=document.createTextNode(txt2);
progdiv.appendChild(txt);

//pēc 1/10 sekundes palaižam atkal AJAX f-ju,
//lai atjaunotu informāciju par failu augšupielādi
setTimeout(('apc("'+nr+'");'),100)
}

//AJAX f-ja, kas saņem informāciju no faila apc_progress.php
//par faila augšupielādes progresu
function apc(nr)
{
if (prog.readyState==4 || prog.readyState==0)
{
//nododam failam progress.php kā parametru faila unikālo identifikatoru
prog.open('GET','progress.php?id='+nr+'&rand='+Math.floor(Math.random()*1000),true);
prog.onreadystatechange=function()
{
if(prog.readyState==4)update_apc_status(prog.responseText,nr);
};
prog.send(null)
}
}

// Šī ir galvenā AJAX f-ja, kas ir diezgan sarežģīta, tāpēc
// vienkārši neaiztieciet to, bet atstājiet, kā ir.
function getHTTPObject(){
var xmlhttp;
/*@cc_on
@if (@_jscript_version >=5)
try{xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")}
catch(e){
try{xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")}
catch(E){xmlhttp=false}}
@else
xmlhttp=false;
@end @*/
if(!xmlhttp && typeof XMLHttpRequest!='undefined')
try{xmlhttp=new XMLHttpRequest()}
catch(e){xmlhttp=false}
return xmlhttp}

// sasaistam mainīgo prog ar austāk esošo AJAX f-ju
var prog=getHTTPObject();

Kods ir diezgan labi komentēts, tāpēc to šeit sīkāk neiztirzāšu. Ja ir kādas neskaidrības par to, kā darbojas AJAX, tad es ieteiktu izlasīt rakstu "AJAX - praktisks piemērs", kur ir diezgan sīki izskaidrots kas un kā.

Nobeigumā

Jāņem vērā, ka PHP funkcija apc_fetch() parāda nevis paša augšupielādējamā faila izmēru, bet gan visa POST pieprasījuma izmēru, līdz ar to, ja tiks vienā formā augšupielādēti vairāki faili, tad apc_fetch() funkcija rādīs informāciju par visiem failiem kopā (un papildus parametriem, kas tiek nodoti ar POST pieprasījumu). Tāpēc nebrīnieties, ka pat nosūtot formu kurā vispār nav norādīts augšupielādējamais fails, tiek uzrādīt daži baiti, kas tiek nosūtīti.

Failu augšupielādes progresa indikatorsRakstā apskatītais piemērs ir tīri izglītības mērķiem, praktiskā situācijā, protams, augšupielādējamais fails vēl ir pēc nepieciešamības jāapstrādā uz servera, kā arī progresa indikatoru var "izskaistināt" ar CSS un uzlabot.

Pārbaudīt darbībā Failu augšupielādes progresa indikātoru var te, bet lejupielādēt ZIP failā te: file-upload-progress-bar.zip.

Raksta sagatavošanā izmantotie resursi:
]]>
Padomi mājas lapas drošībā Kods PHP un MySQL Raksti http://web.hc.lv/kods/php-mysql/raksti/padomi-majas-lapas-drosiba/ http://web.hc.lv/kods/php-mysql/raksti/padomi-majas-lapas-drosiba/ Wed, 13 Feb 2008 16:02:04 +0200 web.hc.lv - vortāls tīmekļa veidotājiem Rakstā apskatītas dažas biežāk sastopamās problēmas mājas lapu drošībā, lai sniegtu ieskatu, ar ko jārēķinās, kad tiek izstrādāta mājas lapa.
Sen pagājis laiks, kad lielākajai daļai cilvēku internets bija liels un nezināms labirints. Ir apgūts daudz no tā, ko tas spēj piedāvāt, un tagad kārta pienākusi atzīmēties interneta plašumos ne tikai komentāru laukos, bet arī publicējot pašam savu mājas lapu. Kā to izdarīt, tiek mācīts gan skolās, gan universitātēs, bet ne vienmēr ar to vien pietiek. Vajadzīga arī pieredze, kā nodrošināt, lai lapa tiešām strādātu ilgi un kvalitatīvi. Piemēri pārsvarā attieksies uz mājas lapu servera pusē izpildāmo kodu (vai nu PHP, vai ASP.NET, vai arī JSP utt.), bet ar daļu no problēmām var sastapties arī statiskās HTML lapās.

Izpētiet savas lapas web serveri

Pirmais, par ko jādomā jau pirms mājas lapas izstrādes, ir serveris, kurā tā tiks izvietota. Jāņem vērā, ka servera administratoram ir pilnīga piekļuve visiem datiem, kas atrodas serverī, – gan izejas kodam, gan datu bāzei. Ir vērts pārdomāt, vai savus datus (un arī sistēmas lietotāju datus) esat gatavs uzticēt šim administratoram. Noderīgi arī pārliecināties, vai administrators, lai novērstu to, ka iespējams uzlauzt serveri, vienmēr atjaunina servera programmatūru.

Ar servera konfigurāciju ir saistīta vēl kāda ļoti liela problēma – ja serverī ievietotas vairākas mājas lapas, tad jāpārliecinās, vai nav iespējams, strādājot ar kādas citas mājas lapas kodu, piekļūt jūsu rakstītajam kodam. Šī kļūda ir visai izplatīta, jo parasti web serverī tiek noteiktas piekļuves tiesības vienam sistēmas lietotājam apstrādāt visas lapas. Ja nav veikti speciāli drošības pasākumi, dažādu mājas lapu kodi nav savstarpēji izolēti.

DrošībaParūpējieties par izejas koda drošību

Viens no galvenajiem drošības pasākumiem jebkurai lapai ir sargāt tās izejas kodu. Ja vien neesat pilnībā pārliecināts par to, ka kods ir pilnīgi bez kļūdām, tad tā izplatīšana var sagādāt nepatīkamus pārsteigumus. Iespējams, ka kāds interesents to izpētīs un, pamanījis kļūdu, to izmantos, lai veiktu mājas lapā nevēlamas darbības. Daudzas no rakstā minētajām kļūdām ļoti grūti ir izmantot praksē, ja ļaundarim nav pieejams kods, jo tas nozīmē, ka, uzlaužot lapu, jātērē daudz vairāk laika. Ja tiek lietots kāds Open Source risinājums, tad obligāti jāuzmana, kad tiek publicētas jaunākas versijas, jo, izmantojot šo risinājumu, internetā var atrast ne tikai problēmas aprakstus, bet arī gatavus paraugus, kā to izmantot, lai lapu uzlauztu. Ļoti spilgts piemērs ir portālu sistēma PHPNuke, kas kādu laiciņu atpakaļ bija ļoti populāra. Savu izmēru dēļ tā diemžēl bija pilna ar kļūdām, kuras ik pa laikam izmantoja, lai uzlauztu ne tikai atsevišāmājas lapas, bet arī pat veselus serverus, kuros šīs mājas lapas atradās.

Servera drošība ir ļoti svarīga, taču pat vislabākais serveris nespēs pasargāt no problēmām, kuras rodas slikti uzrakstīta mājas lapas koda dēļ. Turpmākie piemēri attiecas uz PHP valodu, bet arī citās programmēšanas valodās tie var būt aktuāli.

Neļaujiet nolasīt svarīgus failus

Ļoti bieži sastopams risinājums lapas navigācijai ir URL parametrā norādīts tā faila nosaukums, kuru lietotājs grib redzēt. Piemēram, http://serveris/index.php?lapa=about.php. Pats par sevi šāds risinājums vēl nerada problēmas, ja vien servera kods ir pareizi uzrakstīts. Piemēram, ja kodā rakstīts <?require $_GET['lapa']?>, tad potenciālajam ļaundarim vārti ir vaļā. Ja kā parametrs tiek norādīts ?lapa=/etc/passwd, tad var iegūt visu sistēmas lietotāju sarakstu (iespējams, pat ar visu paroļu kodētajām formām). Šāda koda rindiņa ļauj iegūt gandrīz jebkuru failu, kas atrodas serverī.

Ir vairākas iespējas, kā to nepieļaut, piemēram, veidojot masīvu ar to failu nosaukumiem, kurus drīkst pieprasīt, vai arī lietot PHP funkciju basename(), kas izdzēš speciālos simbolus (. vai /) no parametra. Līdzīga problēma rodas tad, kad dažādi datu faili ir nolasāmi no servera, ierakstot to nosaukumu adreses laukā. Piemēram, ja paroles glabājas failā http://serveris/passwords.txt vai arī http://serveris/config.inc (ja paplašinājumu *.inc serveris nemāk apstrādāt kā PHP kodu).

Piešķiriet sākumvērtību mainīgajiem

Mazāk sastopama problēma slēpjas PHP funkcionalitātē register_globals, kas automātiski izveido mainīgos ar datiem, kādus lietotājs ieraksta lapas pieprasījumā. Pēdējās PHP versijās šī funkcionalitāte ir izslēgta pēc noklusējuma, tāpēc tā vairs nav sastopama tik bieži, bet šo problēmu ļoti labi ilustrē šāds piemērs:

http://serveris/index.php?show_all=1
<?php
if ($_SESSION['admin']) $show_all=true;
....
if ($show_all)
/*šeit nonākam, pat ja nav admins, jo
parametrā ir padots mainīgais ar tādu pašu
nosaukumu*/
?>

Šajā gadījumā administratoram ir paredzēts rādīt papildu datus. Bet, tā kā mainīgais $show_all tiek izmantots tikai tad, ja lietotājs ir reģistrēts kā administrators, parasts lietotājs, pieprasot lapu ar iepriekšminēto adresi, arī var piekļūt šiem pašiem datiem. Kā redzams, šī problēma ir aktuāla tikai tad, ja arī kods nav korekts (mainīgo vērtības netiek inicializētas) un ļaundarim pie tam ir zināms mainīgā nosaukums. Tāpēc svarīgi ir glabāt savas lapas kodu pie sevis un neizdāļāt jebkuram. Pat ja šī problēma kodu neskar, iespējams, ka pieļautas kādas citas kļūdas, kas var novest pie līdzīga rezultāta.

Nodrošiniet lietotāja datu pārbaudi

Pati lielākā problēma dinamisku web lapu veidošanā ir tā, ka netiek pārbaudīti lietotāja ievaddati. Ja dati, ko lietotājs nosūta lapai, netiek pārbaudīti, ļaundarim paveras ļoti plašas iespējas dažādos veidos uzbrukt lapai. Turklāt nekad nedrīkst paļauties uz to, ka dati, kas, piemēram, atrodas slēptajos (hidden) laukos, nonāks serverī tieši tādi, kādi tie ir bijuši. Piemēram, nekad nedrīkst ievadīt lietotāja identifikatoru šādā veidā, jo tas ļauj lietotājam izmainīt šo vienu vērtību un sistēma uzskatīs, ka ar to strādā jau pavisam cits lietotājs. Nākamā iespēja izmantot šo problēmu ir tā sauktās SQL injekcijas, kad lietotājs var piemuļosistēmu, lai tā izpilda lietotāja izvēlētu SQL pieprasījumu. Piemēram:

http://serveris/index.php?id=1 –korektais pieprasījums
http://serveris/index.php?id=1 or TRUE – modificēts pieprasījums
<?php
mysql_query("update Tabula set apskatits=''Y' where id_col=".$_GET['id']);
?>

Kā redzams minētajā piemērā, ar modificēto pieprasījumu lietotājs piespiež sistēmu norādīt pilnīgi visiem datu bāzes ierakstiem vērtību apskatits=’Y’. Pat tad, ja SQL pieprasījumā visi mainīgie tiek ievietoti pēdiņās (id_col='1'), ir jāpārbauda, vai lietotāja ievaddatos nav pēdiņu, un jāpievieno tām prefikss “\”. PHP to automātiski nodrošina ar konfigurējamu iespēju magic_quotes, kas pēdējās PHP versijās ir ieslēgta pēc noklusējuma.

Trešā problēma lietotāja ievaddatos slēpjas iespējā saglabāt HTML kodu. Piemēram, lietotājs var saglabāt datus, kas satur <iframe src=http://mana/lapa/ style="position:absolute; left:0; top:0;width:100%; height:100%; z-index:1000"></iframe>. Ja servera kods neapstrādā šos datus korekti, turpmāk katru reizi, kad šie dati tiek parādīti lapā, lietotājs redz tikai un vienīgi to lapu, kuras adrese ir http://mana/lapa/. Ja šī lapa izskatās līdzīga oriģinālajai lapai, tad ir iespējams piemānīt citus lietotājus un iegūt viņu lietotājvārdus un paroles vai citu svarīgu informāciju. Šo problēmu sauc par cross-site scripting (CSS), un vienkāršākais veids, kā no tās izsargāties, ir neļaut lietotājam saglabāt HTML kodu, piemēram, izmantojot PHP funkciju strip_tags() vai arī aizstājot simbolu “<” ar “&lt;”, kas nodrošinās to, ka lietotāja ievadītais kods tiks rādīts kā parasts teksts. Otrs cross-site scripting izmantošanas veids ir saglabāt nevis iepriekšminēto elementu iframe, bet gan elementu script ar klienta kodu, kas veidots tā, lai tas var nozagt kādu citu lietotāju unikāli identificējošo cookie ar lietotāja sesijas identifikatoru (session_id).

Ja šo session_id sliktais kods nosūta savam autoram, tad autors to var izmantot, lai piemānītu sistēmu un uzdotos par šo otro lietotāju. Iespējamie risinājumi ir, gan izmantot iepriekš minētos, gan arī piesaistīt session_id lietotāja IP adresēm.
Protams, ir jāpārliecinās arī, vai lietotājs nemēģina sistēmai nodot pārāk lielus pieprasījumus, kas var novest vai nu pie tā, ka izbeidzas sistēmas operatīvā atmiņa, vai cietā diska brīvā vieta, vai arī datu bāze tiek pārpildīta ar daudziem ierakstiem, kas krasi samazina sistēmas darbības laiku.

Lai nodrošinātu svarīgu lapu drošību, konsultējieties ar speciālistu

Pat tad, ja viss iepriekš teiktais tiek ievērots, sistēmu vajag aizsargāt arī pret citām drošības kļūdām. Visas iespējamās kļūdas nemaz nav iespējams uzskaitīt. Vislabākais variants ir mājas lapas audits, ko veic pieredzējuši eksperti. Tas palīdz atrast iespējamajās problēmas un saņemt rekomendācijas, kā no tām izvairīties.

Taču arī audits un citi drošības pasākumi neko nedos, ja lapas administratīvais interfeiss (ja tāds eksistē) netiks aizsargāts ar drošu paroli vai vēl labāk – administratīvajam interfeisam piekļuve tiks atļauta tikai no sev piederošiem datoriem (mājas, darba utt.). Arī citiem sistēmas lietotājiem nebūtu vēlams atļaut izmantot elementāras vai pārāk īsas paroles, kā arī tās obligāti ir jāglabā šifrētā veidā.

Nobeigumā jāteic, ka absolūti drošas sistēmas nav un visdrošāk web lapa būtu aizsargāta tad, ja to vispār neizvietotu internetā. Turklāt nekad nevajadzētu uzskatīt, ka teiciens “Īsti vīri rezerves kopijas netaisa” jāievēro arī dzīvē.


(Informācija pārpublicēta no knagis.miga.lv ar autora atļauju.)
]]>
PHP/MySQL izstrādes vides sagatavošana uz Windows Kods PHP un MySQL Raksti http://web.hc.lv/kods/php-mysql/raksti/izstrades-vides-sagatavosana-uz-windows/ http://web.hc.lv/kods/php-mysql/raksti/izstrades-vides-sagatavosana-uz-windows/ Tue, 12 Feb 2008 13:19:11 +0200 web.hc.lv - vortāls tīmekļa veidotājiem Lai vispār kaut ko sāktu darīt ar PHP, ir jāsagatavo vide, kur strādāt. Tas nozīmē, ka ir jāuzstāda web serveris, jāpieslēdz tam PHP, un ja gribam strādāt ar datubāzēm, tad jāuzstāda arī kāda datubāžu sistēma. Mēs izmantosim MySQL.
Šī pamācība nav tikai tiem, kas vēl nav strādājuši ar PHP, bet arī tiem, kas jau izmanto PHP, bet līdz šim ir izmantojuši gatavās web serveru pakas (tādas, kas automātiski ieinstalē gan pašu web serveri, gan PHP, gan MySQL u.t.t).

Pamācība ir paredzēta Windows lietotājiem.

šajā pamācībā tiks apskatīta Apache 2.2 web servera, PHP 5 un MySQL 5 uzstādīšana. Pašās beigās būs arī neliels sarakts ar bezmaksas PHP koda redaktoriem un bezmaksas MySQL klientiem.

Ja pamanāt kādas kļūdas, droši norādiet uz tām. Ja ir kādi ieteikumi vai aizrādījumi, noteikti nekautrējaties tos izteikt.

Apache uzstādīšana

Pirms sakāt instalāciju, pārliecinieties, ka jums jau nav kādas aplikācijas, kas izmantotu 80. portu. Piemēram, Skype. Ja jums ir ieinstalēts Skype, tad pārliecinieties tā konfigurācijā, ka tas neizmanto šo portu.
  1. Apache instalācija Vispirms dodamies uz Apache servera mājaslapas lejupielāžu sadaļu un lejupielādējam instalētāju priekš Windows. Lejupielādēt var arī vecākas Apache versijas, bet mēs instalēsim jaunāko 2.2 versiju. Jānovelk ir fails, kas atrodas pretī Win32 Binary without crypto (no mod_ssl) (MSI Installer). Ja jums ir vajadzīgs OpenSSL atbalsts, tad izvēlieties otru instalāciju. Ja nezināt, kas tas tāds, tad par to jums nav jāuztraucas.
  2. Kad fails novilkts, atveram to, spiežam Next līdz kamēr nonākam līdz logam, kur prasa ievadīt informāciju par serveri (Server information). Pie Network Domain ievadam "localhost", pie Server Name arī. Kā Administrator's Email Address norādam savu e-pastu.
    Atstājiet čeksīti pie All Users, on Port 80, as a Service.
    Kad viss gatavs, spiežam Next.
  3. Nākamajā logā izvēlamies Typical un spiežam Next.
  4. Atstājam, lai Apache tiktu ieinstalēts noklusētājā C:\Program Files\Apache Software Foundation\Apache2.2 direktorijā. Protams, ja ir vēlme, var norādīt arī citu direktoriju. Spiežam Next Pabeidzam instalāciju, nospiežot Install.

PHP uzstādīšana

PHP Kad Apache ir uzinstalēts, varam ķerties klāt pie PHP uzstādīšanas.
  1. Dodamies uz PHP.net lejupielāžu sadaļu un lejupielādējam svaigākās PHP versijas ZIP failu (PHP x.x.x zip package zem Windows Binnaries). Mēs instalāciju neizmantosim.


  2. Novilktā ZIP faila saturu atarhivējam zem, piemēram, C:\php\.


  3. C:\php\ direktorijā sameklējam failu php.ini-recommended un izveidojam tam kopiju php.ini.


  4. Atveram šo failu (php.ini). šis fails turpmāk būs galvenā vieta, kur veiksiet PHP konfigurācijas izmaiņas. Atceraties, ka pēc katras izmaiņas, ko veicat šajā failā, jums būs obligāti jāpārstartē web serveris (savādāk izmaiņas vienkārši nestrādās).

    Sameklējam, kur tiek norādīta error_reporting vērtība un pārliecināmies, ka ir norādīts "E_ALL". Tāpat sameklējam display_errors un pārliecināmies, ka ir norādīts "On". Galu galā mēs gatavojam vidi izstrādei, tāpēc mums ir svarīgi redzēt visas kļūdas.

    Tālāk pārliecināmies, ka register_globals ir "Off", kā arī, lai magic_quotes_gpc būtu "Off".

    Pēc tam vajag izlabot extension_dir konfigurācijas parametru, lai PHP zinātu kurā direktorijā meklēt papildmoduļus. Ja ieinstalējāt PHP C:\php\ direktorijā, tad norādiet: extension_dir="C:\php\ext"

    Pārliecinieties vai C:\php\ direktorijā ir tāda direktorija ext. Pēc noklusējuma vajadzētu būt.

    Pēc tam sameklējam Dynamic Extensions sadaļu, kur var norādīt kādus paplašinājumus ielādēt (piem., MySQL, GD u.c.). Pagaidām mums vajadzēs tikai vienu paplašinājumu: mysql. Atkomentējam to, izdzēšot no līnijas sākuma semikolu (;).

    Kad tas viss izdarīts, saglabājam izmaiņas un aizveram failu.


  5. Ejam uz Windows kontrolpaneli un atveram System (Vai arī nospiežot ar labo peles pogu uz My Computer ikonas, izvēlamies Properties).

    Tālāk nospiežam Advanced šķirkli, un nospiežam uz pogas Environment Variables. Vajadzētu atvērties logam, kurā ir divi saraksti. Mums vajag otro sarakstu, kam virsraksts ir System variables. Tajā sameklējam mainīgo PATH. Izvēlamies to un nospiežam rediģēt pogu (Edit). Vajadzētu atvērties nelielam lodziņam, kur var labot mainīgā vērtību (Variable value). Labojiet ļoti uzmanīgi, neizdzēsiet neko. Vērtībai pašā galā pieliekam šo: ;C:\php
    Pievērsiet uzmanību semikolam. Ceļu, protams, norādot tādu, kur iekopējāt PHP.

    Kad tas viss ir izdarīts, tad aptiprinām visas izmaiņas un pārstartējam datoru.

    šis solis bija vajadzīgs, lai PHP dažādie moduļi (piemēram, mysql) varētu atrast vajadzīgos bibliotēku (dll) failus, kas atrodas PHP direktorijā.

    Bez tam vēl arī turpmāk konsolē (Command prompt) būs iespējams izsaukt php.exe komandrindas programmu no jebkuras vietas. Ja jums nav skaidrs, kas tas ir vai kam tas vajadzīgs, tad šobrīd par to varat neuztraukties.


  6. Kad dators pārstartēts, tad tagad mums atliek pievienot PHP web serverim, lai tas visus PHP failus apstrādātu ar PHP. Sameklējam C:\Program Files\Apache Software Foundation\Apache2.2\conf direktorijā failu httpd.conf. šis ir fails, kur atrodas visa konfigurācija attiecībā uz Apache web serveri.


  7. httpd.conf failā sameklējam rindiņu DocumentRoot un izlabojam to uz direktoriju, kur vēlēsimies glabāt visus savus web dokumentus. Piemēram, C:\htdocs. Protams, neaizmirstam arī izveidot šo direktoriju.
    Tālāk meklējam aptuveni šādu vietu:
    #
    # This should be changed to whatever you set DocumentRoot to.
    #
    <Directory "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs">

    Un izmainam tajā C:/Program Files/Apache Software Foundation/Apache2.2/htdocs uz to pašu direktoriju, ko norādījām DocumentRoot konfigurācijas parametrā.


  8. Kad tas izdarīts, tad tālāk meklējam aptuveni šādu vietu:
    #
    # DirectoryIndex: sets the file that Apache will serve if a directory
    # is requested.
    #
    <IfModule dir_module>
    DirectoryIndex index.html
    </IfModule>

    Un pievienojam klāt index.php. Rezultātam vajadzētu izskatīties aptuveni šādam:
    DirectoryIndex index.html index.php

    Šis konfigurācijas parametrs nosaka, ka ja apmeklētājs mēģina atvērt kādu direktoriju (piemēram, http://example.com/site/), nenorādot failu, tad web serveris meklēs šinī direktorijā index.html, un ja neatradīs, tad pēc tam index.php, un atriezīs apmeklētājam to.

  9. Kad vajadzīgās izmaiņas veiktas, tad faila beigās pievienojam šādas rindiņas:
    # PHP5
    LoadModule php5_module "c:/php/php5apache2_2.dll"
    AddType application/x-httpd-php .php
    PHPIniDir "C:/php"

    Šīs ir tās rindiņas, kas patiešām atbild par PHP piesaisti web serverim. Neaizmirstam izlabot ceļus uz pareizajiem.

    Kad viss ir izdarīts, saglabājam izmaiņas un veram konfigurācijas failu ciet.


  10. Tagad mums vajadzēs pārstartēt Apache web serveri, lai tiktu ņemtas vērā veiktās izmaiņas konfigurācijā.

    Viens veids kā pārstartēt web serveri, ir izmantojot nelielu programmiņu "Monitor Apache Servers" (to var atrast tur pat, kur tika ieinstalēts pats Apache).

    Otrs, universālāks veids, ir izmantot iebūvēto Windows Services rīku. To var atrast Windows kontrolpanelī zem Administration Tools. Atveriet Services programmu un sarakstā sameklējiet servisu ar nosaukumu Apache2.2 vai līdzīgi. Nospiežot uz tā ar labo pogu, parādīsies iespēja gan apstādināt, gan pārstartēt web serveri.

    Atcerieties, ka Apache web serveris ir jāpārstartē pēc katrām izmaiņām PHP konfigurācijā (php.ini) vai pašā Apache web servera konfigurācijā (httpd.conf).

Pārbaudam vai viss strādā

Kad visas iepriekšējās darbības ir veiktas, varam izveidot savu pirmo skriptu. Atveram direktoriju, ko norādījām DocumentRoot konfigurācijas parametrā un izveidojam tur failu index.php. šajā failā ievietojam šādu tekstu:
<?php phpinfo(); ?>

Failu saglabājam. Atveram pārlūku un ierakstam tajā http://localhost. Ja viss ir noticis veiksmīgi, tad pārlūkā vajadzētu atvērties lapai, kur pašā augšā būtu norādīta PHP versija un tālāk daudz dažādas informācijas par PHP konfigurāciju.

Ja pārlūks paliek gaidot vai arī tiek atvērta 404 lapa (kļūda, ka lapa nav atrasta), tad vēlreiz pārskatiet vai pareizi uzstādījāt Apache web serveri. Pārliecinieties, ka tas ir iestartēts (skatīt 10. soli).

Ja pārlūkā atveras skripta saturs, vai arī pārlūks jums piedāvā lejupielādēt index.php failu, tad tas nozīmē, ka PHP nav pareizi piesaistīts Apache web serverim. Pārskatiet uzstādīšanas soļus vēlreiz.

MySQL uzstādīšana

  1. MySQLDodamies uz MySQL lejupielāžu sadaļu un lejupielādējam MySQL instalāciju ar nosaukumu Windows Es sentials (x86). Kad instalācija novilkta, palaižam to.
  2. Spiežam Next, līdz nonākam pie instalācijas veida izvēles. Izvēlamies Custom. Spiežam Next, tad Install.
  3. Kad instalācija pabeigta, iespējams, atvērsies reklāmas logs. Spiežam Next garām visām reklāmām, ja tādas ir, līdz nonākam līdz logam ar pogu Finish. Pārliecināmies, ka ir ielikts ķeksītis pie Configure the MySQL Server now un spiežam Finish.
  4. Tagad vajadzētu atvērties konfigurācijas vednim. Spiežam Next un izvēlamies Detailed Configuration. Spiežam Next.
  5. Atstājam ķeksi pie Developer Machine un spiežam Next.
  6. Atstājam ķeksi pie Multifunctional Database un spiežam Next.
  7. Logā, kur tiek konfigurēti InnoDB uzstādījumi, neko nemainām. Ja jums nav ne jausmas par ko iet runa, tad neuztraucaties. Spiežam Next.
  8. Atstājam ķeksi pie Decision Support (DSS)/OLAP. Spiežam Next.
  9. Pārliecināmies, ka ir ieķeksēts Enable TCP/IP Networking. Atstājam ķeksi arī pie Enable Strict Mode. Spiežam Next.
  10. Izvēlamies Best Support For Multilingualism. Izvēloties šo, datus datubāzē varēsim glabāt UTF-8 kodējumā. Tas galvenokārt nozīmē, ka nebūs problēmu ne ar krievu, ne ar latviešu tekstu glabāšanu vienuviet. Spiežam Next.
  11. Atstājam ķeksi pie Install As Windows Service, kā arī pie Launch the MySQL Server automatically. Protams, ja nevēlaties, lai MySQL tiktu palaists katru reizi, kad ieslēdz datoru, varat noņemt ķeksi no Launch the MySQL Server automatically.
    Ja vēlaties, lai konsolē (Command prompt) no jebkuras vietas varētu izsaukt mysql rīku, tad ielieciet ķeksi pie Include Bin Directory in Windows PATH.
    Spiežam Next.
  12. Ievadam paroli root lietotājam. šo atcerieties, jo ar to slēgsieties klāt datubāzei. Spiežam Next.
  13. Spiežam Execute.
Ja viss kārtībā, spiežam Finish. Datubāzes sistēma ir ieinstalēta. Tā ir gatava lietošanai.

Bezmaksas MySQL klienti

Bezmaksas PHP koda redaktori

Raksts pārpublicēts web.hc.lv ar www.webmeistari.lv un Andra Priedītes piekrišanu.
]]>