Beste mensen, ik heb te horen ekregen dat in een source van mij een RFI bug zit.

<?PHP
$page = substr($_GET['page'],0,3);
$page1 = substr($_GET['page'],0,7);

if( ($page == "../") OR ($page == "ima") OR ($page == "inc") OR ($_GET['page'] == "./") OR ($_GET['page'] == "../") OR ($page == "../") OR ($page1 == "http://") OR ($_GET['page'] == "/etc/passwd") OR ($_GET['page'] == "style/style.css") ) {
include("errors/error.php"); // Error
} else {
if ( !empty ( $_GET['page'] ) AND isset ( $_GET['page'] ) ) {
if ( file_exists ( $_GET['page'] ) ) {
include $_GET['page']; // Page self
} else {
include("errors/error.php"); // Error
}
} else {
include("home.php"); // Index
// }
}
}
}
?>

Is de code bij mij, ik werk verder op de site met mod_rewrite.

Wat is hier fout aan?

En wat kan je tegen RFI bugs doen, en wat is het precies?
Jammer genoeg geef je je website niet, dan kan ik het aantonen. Maareh, je kan ook externe websites includen, of 'terug' in de directory structuur en (afhankelijk van je besturingssysteem) allemaal files openen.
Zo pagina's die ge-include mogen worden in een array zetten en dan met [php]in_array[/php] kijken of $_GET['page'] in die array staat...

[edit]SplaakGeblek[/edit]
Of standaard alles uit een bepaalde map halen, en een controle met is_file() erbij proppen.
Dat heb ik ook, maar het komt denk ik door mod_rewrite ook.

Want alles wordt gecontroleerd of het is_file() maar dan als file_exisits(), of kan je met is_file beter beveiligen.
Martin Meijer schreef op 24.04.2007 17:40
ze hebben weer de database gedropt.

Dat is weer een heel ander probleem: MySQL-Injection?
Er zijn voor jouw al meerdere oplossingen gegeven hoor... Of ben ik nouw scheel?
Minn excuses, maar ik ben niet thuis hierin, dus het zou fijn zijn om gewoon antwoord te krijgen op de vraag die ik stel.

En als ik het niet gezien heb.... dan zou ik het zeer op prijs stellen dat iemand mij een goede uitleg geeft over dit gebeuren en hoe dit op te lossen?

Zit de oplossing in de link die ik gezet heb? Of heef tiemand hier de oplossing gegeven?

Het is de enigste bug nog op mijn site..
Dit is 1:

Inderdaad roep in deze pagina maar eens page=index.php op als dit script zich in index.php bevind... En daar heb je je oneindige loop. Dus even nog een or toevoegen met als page = index.php error weergeven...


Dit is 2:

Zo pagina's die ge-include mogen worden in een array zetten en dan met in_array kijken of $_GET['page'] in die array staat...


En dit is 3:

Of standaard alles uit een bepaalde map halen, en een controle met is_file() erbij proppen.
Mijn excuses voor als ik he tniet goed begrepen heb!

Erg bedankt voor de extra uitleg!

Ik zie inderdaad de loop

Met de is_file() moeten dan alle bestanden van de website in 1 map staan, of maakt het niet uit in welke map deze zich bevinden. Ik heb op de site een complete mappen structuur.

Ik denk dat de tweede een goede oplossing kan zijn, die fraai simpel te implementeren is.

Corrigeer mij aub als ik het fout heb gezien?

Reageren