probleme avec include et require

Eléphant du PHP | 107 Messages

23 févr. 2010, 17:57

bonjour,

voici la configuration de mon sreveur local sous wamp

Code : Tout sélectionner

Configuration Serveur Version de Apache: 2.2.8 Version de PHP: 5.2.6
je fais comme ça

Code : Tout sélectionner

require_once("http://127.0.0.1/xxxxxx/php/sources/logging/allDBAccess.php"); $pgDBConn = new allDBAccess()
il me retourne cet erreur

Code : Tout sélectionner

Fatal error: Class 'allDBAccess' not found in C:\wamp\www
j'ai déjà activé le allow_url_fopen = On et allow_url_include = On de ma php.ini
avec include ou require c'est la même erreur
si vous avez une idée
merci

ViPHP
ViPHP | 5462 Messages

23 févr. 2010, 18:08

c'est normal, tu reçois le fichier interprété

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

23 févr. 2010, 18:42

Ouvre ton navigateur et rend toi à l'adresse "http://127.0.0.1/xxxxxx/php/sources/log ... Access.php" (tout du moins, celle que tu as réellement mise dans ton fichier).
Et tu verras ce que le serveur PHP a reçu comme code.

Il faut passer par des chemins système (comme tu es sous Windows, un truc du genre "C:\...")
Tout en sachant qu'il est plus conseillé d'utiliser des chemins relatifs au fichier où tu te trouves, pour permettre de déplacer ton code source sur un autre serveur.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5462 Messages

23 févr. 2010, 18:57

pour résoudre ton problème il faudrait que le fichier ne soit pas interprété, un petit coup de htaccess "removehandler" et le tour est joué

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 févr. 2010, 10:48

:afraid:
Et comme ça, non seulement il doit faire en sorte que toute son arborescence de fichier soit accessible par le web, mais en plus qu'elle soit accessible par tout le monde.

Non, honnêtement, faire des include par le serveur web n'est pas une bonne idée.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 107 Messages

24 févr. 2010, 11:28

bonjour à tous ,

je vous explique le problématique

je dois récupérer des informations depuis des bases de données clients externes et puis les insérer de mon côté après pour des autres utilisations :

j'ai crée ces 2 scripts qui gère les traitements de mon côté
class importLink {
	var $dbLayer;
	var $xmlDoc;
   	
	public function getExternalIdByXmlFile($xmlFile) {
		$this->xmlDoc=new DOMDocument();
	    $this->xmlDoc->Load($xmlFile);
	    $extIds=$this->xmlDoc->childNodes->item(0)->childNodes;
	    
	    $externalId = array();
	    foreach($extIds as $extId) {  	    
             $externalId[] = $extId->textContent;
	    }
	    return $externalId;
	}
	
	
	public function insertIdImported($internalId,$externalId,$dbLayer) {
		$this->dbLayer = $dbLayer;
		//Insert external_id with unique value of internal_id in the client_links table
		$linkSql = "insert into client_links(internal_id,external_id) values (:internalId,:externalId)";
		$this->dbLayer->executeSQL($linkSql,array(":internalId"=>$internalId,":externalId"=>$externalId));
		echo "<strong> Saving External id :</strong>".$externalId."<br>";
	}
	
}
et l'autre pour les setting des params et l'appel des méthodes des classes
require_once("importLink.php");
require_once ("allDBAccess.php");

//Parameter of internal table
$driver = "pgsql";
$host = "localhost";
$databasename ="xxxxxxx";
$login = "postgres";
$pass = "admin";

$internalDbConn = new allDBAccess($driver,$host,$databasename,$login,$pass);
$objectImportLink = new importLink();
$extID = $objectImportLink->getExternalIdByXmlFile("http://adresseDu clientcontenantlefichierxml/ext_id.xml");

if($extID!=null and sizeof($extID)>0) {
		 for($i=0;$i<sizeof($extID);$i++) { 
		 $internalId = rand();
		 $resultImport = $objectImportLink->insertIdImported($internalId,$extID[$i],$internalDbConn);
		 }	
}else{
		 echo "NO EXTERNAL ID TO IMPORT";
}
J'ai créé aussi ces 2 fichiers que je pense fournir au client pour qu'ils puissent me géréner un fichier xml contenant les données voulues
class generateXmlofExtid {
	var $dbLayer;
	
	
	public function getExternalId($fieldName,$tableName,$dbLayer) {
		$this->dbLayer = $dbLayer;
		//getting the external_id 
		$sqlExternalId = "select $fieldName from $tableName";
		$resultExtId = $this->dbLayer->executeSQL($sqlExternalId,array());
        if($resultExtId!=null || sizeof($resultExtId)!=0) {
        		return $resultExtId;
        }else{
        		return false;
        }
}
	
	public function getExternalIdfromDb($sqlExternalId,$dbLayer ) {
		$this->dbLayer = $dbLayer;
		//getting the external_id 
		$resultExtId = $this->dbLayer->executeSQL($sqlExternalId,array());
        if($resultExtId!=null || sizeof($resultExtId)!=0) {
        		return $resultExtId;
        }else{
        		return false;
        }
	} 
	
	
	public function generateXml($resultXmlData) {
		$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>';
		$xml.='<client>';
		for($i=0;$i<count($resultXmlData);$i++) {
			$xml .= '<externalId id ="'.$i.'">'.$resultXmlData[$i]['id'].'</externalId>';	
		}
		$xml .= '</client>';
		
		$fp = fopen("ext_id.xml", 'w+');
 		fputs($fp, $xml);
 		fclose($fp);

 		echo 'Export XML effectue !<br><a href="ext_id.xml">Voir le fichier</a>';
		
	}
	
	
}
et un autre fichier principal
require_once("generateXmlofExtid.php");
require_once("allDBAccess.php");

$driver = "mysql";
$host = "localhost";
$databasename ="customers";
$login = "root";
$pass = "";
$tableName = "informations"; 
$fieldName = "id";

$pgDBConn = new allDBAccess($driver,$host,$databasename,$login,$pass);
$newXml = new generateXmlofExtid();

$resultXmlData = $newXml->getExternalId($fieldName,$tableName,$pgDBConn);
print "<pre>";
print_r($resultXmlData);
print "</pre>";

if($resultXmlData!=null || sizeof($resultXmlData)>0) {
	
	$newXml->generateXml($resultXmlData);
}
Là j'ai pris un exemple avec une base de données mysql

Le probleme se pose sur allDbAccess.php appelé du coté des clients
car alldbAccess.php est une classe qui herite d'un autre classe abstraite dans mon serveur
require_once ("BaseDBAccess.php");
class allDBAccess extends BaseDBAccess {
  
	public function getLastInsertedId($param) {
        return $this->oPdo->lastInsertId($param);
    } 
}
qui herite de
abstract class BaseDBAccess {
    var $oPdo=null;

    public function __construct($sDriver='',$sHost='',$sDatabase='',$sUser='',$sPassword='') {
        $sDrive = $sDriver.':dbname='.$sDatabase.";host=".$sHost;
        $this->oPdo=new PDO($sDrive, $sUser, $sPassword);
        $this->oPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public function executeSQL($sql, $parameters) {
        //1. Prepare the statement
        $stamement=$this->oPdo->prepare($sql);
        //2.execute the statement
        $stamement->execute($parameters);
        //3. return the result
        if(!ereg('insert',$sql)) {
            return $stamement->fetchAll();
        }
    }

    abstract protected function getLastInsertedId($tableName);
}

Donc ma question est que
Si je voudrais faire executer par les clients externes mes fichiers config.php et generateXmlofExtid.php comment devais-je procéder pour eviter toute faille de sécurité.

j'ai compris si je fais un require("http:") mon fichier sera interprété

je dois le faire par ftp alors require("ftp:")?

et puis après est_il possible un traitement qui va m'envoyer ce fichier xml généré du côté du client xml dans un repertoire de mon serveur ou je dois faire comme ci-dessus

Code : Tout sélectionner

$extID = $objectImportLink->getExternalIdByXmlFile("http://localhost/xxxxxx/php/sources/logging/ext_id.xml");
c'est à dire que le client va me fournir le chemin d'accès au fichier xml générer à chaque fois que celui ci soit générer?

merci pour votre conseil

ViPHP
ViPHP | 5462 Messages

24 févr. 2010, 11:40

:afraid:
Et comme ça, non seulement il doit faire en sorte que toute son arborescence de fichier soit accessible par le web, mais en plus qu'elle soit accessible par tout le monde.

Non, honnêtement, faire des include par le serveur web n'est pas une bonne idée.
ca peu être voulu, et en plus on peu reteindre l'accès via apache

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 févr. 2010, 11:49

ca peu être voulu, et en plus on peu reteindre l'accès via apache
Dans ce cas, donne la solution complète, pas un bout de solution qui, mal compris, peut être une énorme faille de sécurité.

Sinon, pour @jajax, je pense que la solution la plus simple est de lui fournir tout le code nécessaire.
En gros, soit tu ne lui donne presque aucun code, et tu restes maitre de tout, soit tu lui fourni tout le code nécessaire, quitte à perdre la possibilité de faire évoluer simplement ce code.
Mais placer quelques classes chez lui qui héritent de classes chez toi me semble risqué puisque tu ne pourras pas forcément faire évoluer le code chez lui, mais tu ne pourras faire évoluer ton propre code chez toi puisque son code utilise le tiens.

Sinon, pour ce genre de solution, tu peux passer par des canaux sécurisé, comme le sous-entends stealth35
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5462 Messages

24 févr. 2010, 12:08

comme je t'ai dis ca peu être voulu, a mon taff on a des petit exo de formation a word excel et compagnie, sauf que tout le mécanisme est déporter chez la boite auquel on loue ca, et pourquoi ? parce que dans le leur fichier ca creer un hash particulier qui évite de faire un allé retour en insérant des valeur POST ou GET pour les sessions.

après niveau apache on peu toujours reteindre niveau ip (ou juste en local)
mais après OUI c'est débile de faire ca autant allé cherché le fichier en local,
et vouloir inclure un fichier distant peu être voulu et c'est pas pour rien que require/include l'accepte (sinon on utiliserai readfile...)

Eléphant du PHP | 107 Messages

24 févr. 2010, 12:22

Donc voici c'est que je pense faire :

Un accès à la BDD distant (connexion à la base et traitement de mon coté). mais là certains clients ne vont pas me fournir leurs paramètres tout simplement par peur de sécurité par exemple
- Un service qui me renvois les données que je peux traiter (en XML par exemple) et que je traites de mon coté. là c'est la galère :roll:

ViPHP
ViPHP | 5462 Messages

24 févr. 2010, 12:29

tu peu récupérer via SOAP par exemple.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 févr. 2010, 12:45

Il n'empêche que cette utilisation ouvre une faille de sécurité, et que quand on donne une solution de ce type, la moindre des choses est d'avertir de ces soucis.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 107 Messages

24 févr. 2010, 17:27

Voici la solution que j'ai opté en attendant de familiariser avec curl et tout

j'ai créé un simple formulaire contenant les informations de que le client va renseigner :
$driver
$host
$databasename
$login
$motdepasse

cet formulaire va poster vers un fichier que j'appel main.php
<?php

require_once("importLinkHttp.php");
require_once ("allDBAccess.php");

//Parameter of internal table
$driver = "pgsql";
$host = "localhost";
$databasename ="xxxxxxx";
$login = "xxxx";
$pass = "xxxx";
$internalDbConn = new allDBAccess($driver,$host,$databasename,$login,$pass);
 
$objectImportLink = new importLink();

if(isset($_POST['sendParam']) and !empty($_POST['driverDb']) and !empty($_POST['hostDb']) and !empty($_POST['dbName']) and 
  !empty($_POST['dbLogin']) and isset($_POST['dbPwd'])  and !empty($_POST['fieldName'])  and !empty($_POST['tableName'])) {
			$driverClient = $_POST['driverDb'];
			$hostClient  = $_POST['hostDb'];
			$databaseClient  = $_POST['dbName'];
			$loginClient  = $_POST['dbLogin'];
			$passClient  = $_POST['dbPwd'];
			$fieldClient  = $_POST['fieldName'];
			$tableClient  = $_POST['tableName'];
			
			$externalDbConn = new allDBAccess($driverClient,$hostClient,$databaseClient,$loginClient,$passClient);
			
			$idExternal = $objectImportLink->getExternalId($fieldClient,$tableClient,$externalDbConn);
			
			if($idExternal!=null and sizeof($idExternal)>0) {
						for($i=0;$i<sizeof($idExternal);$i++) { 
							//unique value of $internalId
							$internalId = rand();
							$resultImport = $objectImportLink->insertIdImported($internalId,$idExternal[$i]['id'],$internalDbConn);
						}	
			}else{
						echo "NO EXTERNAL ID TO IMPORT";
			}
   }else{
   			echo "PARAMETERS MISSING";
   }
?>
la classe principale
class importLink {
	var $dbLayer;
   
	public function getExternalId($fieldName,$tableName,$dbLayer) {
		$this->dbLayer = $dbLayer;
		//getting the external_id 
		$sqlExternalId = "select $fieldName from $tableName ";
		$resultExtId = $this->dbLayer->executeSQL($sqlExternalId,array());
        if($resultExtId!=null || sizeof($resultExtId)!=0) {
        		return $resultExtId;
        }else{
        		return false;
        }
	}
		
	
	public function insertIdImported($internalId,$externalId,$dbLayer) {
		$this->dbLayer = $dbLayer;
		//Check if internalId already exist in client_links
        $getIdExt="select external_id from client_links where internal_id=:internalId ";
        $result=$this->dbLayer->executeSQL($getIdExt,array(":internalId"=>$internalId));
		if($result==null and sizeof($result)==0) {
				//Insert external_id with unique value of internal_id in the client_links table
				$linkSql = "insert into client_links(internal_id,external_id) values (:internalId,:externalId)";
				$this->dbLayer->executeSQL($linkSql,array(":internalId"=>$internalId,":externalId"=>$externalId));
				echo "<strong> Saving External id :</strong>".$externalId."<br>";
		}else{
				$extId = $result[0]['external_id'];
				echo "<strong>Id already exists :</strong>".$extId."<br>";	
				return $extId;
		}	 
	}	
}
du coup je gère tout de mon côté
Il suffit juste de dire au client de appeler dans un navigateur cette page
contenant le formulaire et après l'envoi des données les traitements seront faits de mon côté

Je pense que c'est la solution la plus simple et sans faille de sécurité