Page 1 sur 1

probleme avec include et require

Posté : 23 févr. 2010, 17:57
par jajax
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

Re: probleme avec include et require

Posté : 23 févr. 2010, 18:08
par stealth35
c'est normal, tu reçois le fichier interprété

Re: probleme avec include et require

Posté : 23 févr. 2010, 18:42
par zeus
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.

Re: probleme avec include et require

Posté : 23 févr. 2010, 18:57
par stealth35
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é

Re: probleme avec include et require

Posté : 24 févr. 2010, 10:48
par zeus
: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.

Re: probleme avec include et require

Posté : 24 févr. 2010, 11:28
par jajax
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

Re: probleme avec include et require

Posté : 24 févr. 2010, 11:40
par stealth35
: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

Re: probleme avec include et require

Posté : 24 févr. 2010, 11:49
par zeus
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

Re: probleme avec include et require

Posté : 24 févr. 2010, 12:08
par stealth35
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...)

Re: probleme avec include et require

Posté : 24 févr. 2010, 12:22
par jajax
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:

Re: probleme avec include et require

Posté : 24 févr. 2010, 12:29
par stealth35
tu peu récupérer via SOAP par exemple.

Re: probleme avec include et require

Posté : 24 févr. 2010, 12:45
par zeus
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.

Re: probleme avec include et require

Posté : 24 févr. 2010, 17:27
par jajax
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é