Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Dade, dade

Parola la lock screen

Deparazitare externa pisici fara ...

Seriale turcesti/coreene online H...
 Merita un Termostat Smart pentru ...

Sfat achizitie MTB Devron Riddle

Problema mare cu parintii= nervi ...

switch microtik
 Permis categoria B la 17 ani

Sfaturi pentru pregatirea de eval...

Crapaturi placa

cum imi accesez dosarul electroni...
 Momentul Aprilie 1964

Sursa noua - zgomot ?

A fost lansat Ubuntu 24.04 LTS

Pareri apartament in zona Berceni?
 

Apelare functie php din Ajax

- - - - -
  • Please log in to reply
13 replies to this topic

#1
guttuso

guttuso

    Member

  • Grup: Members
  • Posts: 262
  • Înscris: 31.03.2010
Salutare,
Am urmatorul cod Ajax:
function fetch_select(){
  val_name = $('#name').val();
  $.ajax({
	type: 'POST',
   url: 'include/get_db.inc.php',
   data: {
		   name: val_name,
   },
   success: function (response) {
	 document.getElementById('higtchart_medie_gen').innerHTML=response;
	 columnChart( JSON.parse(response));
	}
  });
}
function columnChart(data_v){
  if(data_v.length >0){
	$(function () {
	 $('#higtchart_medie_gen').highcharts({
	   chart: {
		type: 'column'
	   },
......

get_db.inc.php si contine urmatoarea functie, tin sa precizez ca in fisier mai sunt functii:
<?php
function test_name () {
  $ret = [];
  if(isset($_POST['name'])){
	$name = $_POST['name'];
	$sql = "SELECT
			......
			WHERE ID = $name ";
	$result = $conn->query($sql);
	if($result->num_rows > 0){
	  while($row = $result->fetch_assoc()) {
		$ret [] = [$row['NAME'] . ' ' . $row['LASTN'], floatval($row['AVGG'])];
	  }
	}
  }
  if(count($ret) >1) echo json_encode($ret);
  else echo 'Not working';
}
?>

Cum pot apela in codul Ajax functia test_name din php?
Multumesc!

#2
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postguttuso, on 20 noiembrie 2016 - 17:26, said:

get_db.inc.php si contine urmatoarea functie, tin sa precizez ca in fisier mai sunt functii:
Din javascript nu poti apela functii php, doar php poate apela functii php. Fisierul respectiv, daca chiar e asa cum il descrii, contine doar declararea de functii (function xyz() { ... }) dar nu si apelarea lor.

Trebuie sa ai un fisier.php care apeleaza functia in cauza - cu parametrii corecti, de genul:

<?php
include 'db.inc.php';
xyz();


Si din javascript sa apelezi acel URL (via ajax), de genul
url: 'include/fisier.php'

Abia atunci vei avea un apel.

#3
modoran

modoran

    Senior Member

  • Grup: Senior Members
  • Posts: 8,400
  • Înscris: 08.02.2011
Modifici fisierul ala PHP in asa fel incat sa detecteze o anume valoare $_POST care vrei tu, iar in javascriptul ala trimiti acelasi parametru. Nu poti comunica diect intre ajax si php, primul se executa pe calculatorul clientul, iar al doilea pe server, comunica doar via internet.

#4
guttuso

guttuso

    Member

  • Grup: Members
  • Posts: 262
  • Înscris: 31.03.2010
Am rezolvat problema cu ajutorul unui coleg de pe al forum, las mai jos rezolvarea lui poate mai sunt colegi care se vor izbi de problema:
in codul ajax am adaugat la url: include/get_db.inc.php?action=test_name si in php codul:
if (isset($_GET['action']) && is_string($_GET['action']) && function_exists($_GET['action'])) {
call_user_func($_GET['action'], $conn);
}

, $conn este necesar doar daca functia are si parmetrii

Edited by guttuso, 20 November 2016 - 20:01.


#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,238
  • Înscris: 24.02.2007
Comoda solutia, dar miroase a gaura de securitate. Daca cere userul ceva gen "restart server"?

#6
guttuso

guttuso

    Member

  • Grup: Members
  • Posts: 262
  • Înscris: 31.03.2010
eh, de treaba asta nu mai stiam si nici cum as putea face restart server si sa vad ce se poate intampla. Cum as putea rezolva problema intr-un mod care sa nu imi creeze probleme.
Multumesc!

Edited by guttuso, 20 November 2016 - 20:51.


#7
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postguttuso, on 20 noiembrie 2016 - 20:01, said:

Am rezolvat problema cu ajutorul unui coleg de pe al forum, las mai jos rezolvarea lui poate mai sunt colegi care se vor izbi de problema:
in codul ajax am adaugat la url: include/get_db.inc.php?action=test_name si in php codul:
if (isset($_GET['action']) && is_string($_GET['action']) && function_exists($_GET['action'])) {
call_user_func($_GET['action'], $conn);
}

, $conn este necesar doar daca functia are si parmetrii
Pentru alti colegi de forum:

nu folositi acest tip de cod, are o gaura grava de securitate.

Si in general valabil, nu copiati coduri de pe forumuri, ca uneori calitatea e de cel mai jos nivel.

View Postguttuso, on 20 noiembrie 2016 - 20:50, said:

eh, de treaba asta nu mai stiam, atunci cum as putea rezolva problema intr-un mod care sa nu imi creeze probleme.
Multumesc!
Pui un switch ($_GET['action']) si listezi explicit actiunile permise, iar in ramura default a lui switch iti trimiti un e-mail cu datele posibilului atacator care tocmai a incercat sa iti sparga site-ul, apoi ii adaugi adresa IP in fail2ban.

#8
guttuso

guttuso

    Member

  • Grup: Members
  • Posts: 262
  • Înscris: 31.03.2010
Ce rau face acel cod pe langa fatul ca isi face treaba asta nu mai stiu, nu stiu unde am lasat cai de acces in site-ul meu si cum se pot verifica aceste gauri nici asta nu mai stiu. Important este ca am mai invatat ceva astazi.

@OriginalCopy, multumesc!

Edited by guttuso, 20 November 2016 - 20:59.


#9
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

View Postguttuso, on 20 noiembrie 2016 - 20:58, said:

@OriginalCopy, multumesc!
Nu imi multumi inca, poate ai inteles partial sau complet gresit ce am scris. Vino cu codul mai intai pentru review.

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,238
  • Înscris: 24.02.2007
Un principiu de baza: nu avea niciodata incredere in ce-ti ofera userul (ce preiei din $_GET/$_POST sau asemenea). Presupune mereu ca "incearca sa te faca" si scrie cod care sa aibe grija la asta.

Edited by dani.user, 20 November 2016 - 21:14.


#11
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Si nici in $_COOKIE si nici in 99.99% din datele din $_SERVER sa nu ai incredere, si ele pot fi injectate de utilizator.

#12
modoran

modoran

    Senior Member

  • Grup: Senior Members
  • Posts: 8,400
  • Înscris: 08.02.2011

View Postguttuso, on 20 noiembrie 2016 - 20:01, said:

Am rezolvat problema cu ajutorul unui coleg de pe al forum, las mai jos rezolvarea lui poate mai sunt colegi care se vor izbi de problema:
in codul ajax am adaugat la url: include/get_db.inc.php?action=test_name si in php codul:
if (isset($_GET['action']) && is_string($_GET['action']) && function_exists($_GET['action'])) {
call_user_func($_GET['action'], $conn);
}

, $conn este necesar doar daca functia are si parmetrii



Codul asta are 2 probleme:

1.  Tot ce este in folderul "include" ar trebui interzis sa se execute in mod direct prin cereri HTTP si returnat 404 Not Found, ori tu faci exact opusul
2.  Cum au zis colegii lasand userul sa execute functii arbitrare pe server e foarte periculos.  Poate functia restart_server() din PHP nu exista acum, dar daca o folosesti mai tarziu, ea va fi executata si te-ai ars. Tot ce trebuie atacatorul sa faca e sa "ghiceasca" numele unei functii din codul tau si gata.

Daca nu vrei sa tii seama de punctul 1 atunci macar schimba codul PHP astfel:
if (isset($_GET['action']) && $_GET['action'] == "func_name" ) {
func_name();
}



Macar asa atacatorul nu va putea executa functii arbitrare pe server.

#13
guttuso

guttuso

    Member

  • Grup: Members
  • Posts: 262
  • Înscris: 31.03.2010
Sunt foarte la inceput cu ceea ce inseamna php, nu aveam nicio idee ca cineva imi poate termina site-ul aflandu-mi numele unei functii. O sa mai studiez ce inseamna security php
daca vin cu ceva de genul:
$actions = ['nume_functie_1', 'nume_functie_2'];
if (isset($_GET['action']) && is_string($_GET['action']) && in_array($_GET['action'], $actions))) {
$func = htmlspecialchars($_GET['action']);
call_user_func($_GET['action'], $conn);
}


sau
switch($_GET['action']) {
case "nume_functie_1":
	 call_user_func($_GET['action'], $conn);
	 break;
case "nume_functie_2":
	 call_user_func($_GET['action'], $conn);
	 break;
// etc.
default:
// banez utilizatorul.
break;
}

cum stau in cazul acesta?

Edited by guttuso, 22 November 2016 - 23:17.


#14
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,238
  • Înscris: 24.02.2007
In prima varianta, ce rol are $func = htmlspecialchars($_GET['action']);?

In a doua, daca tot ai numele concret in case, poti s-o chemi direct, fara call user func.

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate