Gå til innhold

Fare ved å bruke eval() ?


Anbefalte innlegg

Hei.

 

Jeg driver å overfører nettstedet mitt fra flate filer over til mysql tabeller. Har laget et system hvor jeg legger inn og ender på innhold via html former med php/mysql. Jeg har en del php kode/scripts som jeg vil dele med andre, og presenterer koden med highlight_string($content) og kjører koden med eval("?>".$content);

 

Lurer på om det er farlig å bruke denne funksjonen.

Slik ser koden min ut :

 

connect.php

<?php
# Variables
$username			   = "username";
$password			   = "password";
$host				   = "localhost";
$database			   = "databasename";

#connects to the MySQL server
mysql_connect($host,$username,$password) or die(mysql_error());
mysql_select_db($database) or die(mysql_error());
?>

 

 

index.php

<?php
include('connect.php');
$table=$_GET['table'];

$order=$_GET['order'];
if(!$order) {
$order="title";
}

echo "<table border=1><tr><td class=m>";
include("navigation.php");
echo "</td>";

echo "<td valign=top width=800 class=n height=100%>";
if(empty($_GET['table'])) {
include("home.php");
}
elseif(ereg('phpmysql|scripts_php',$table)) {
include("code.php");
}
else {
include("pages.php");
}
echo "</td></tr></table>";
?>

 

 

navigation.php

<?php
$sql = "SHOW TABLES FROM $database";
$result = mysql_query($sql);

echo "<font face=cursive>".$_SERVER['SERVER_NAME']."</font>";
echo "<hr class=hr>";
echo "<a class=cd href=http://www.url.com>Home</a><br>";
while ($tables = mysql_fetch_row($result)) {
if(ereg('home|code|css|familietre|stats|telefonliste|text',$tables[0])) {
}
elseif($_GET['table']==$tables[0]) {
echo "<a class=cd href=index.php?table=$tables[0]><span class=code><b>".ucfirst($tables[0])."</b></span></a><br>";
}
elseif($tables[0]=='siteinfo') {
echo "<a class=cd href=index.php?id=1&table=siteinfo>".ucfirst($tables[0])."</a><br>";
}
else {
echo "<a class=cd href=index.php?table=$tables[0]>".ucfirst($tables[0])."</a><br>";
}
}
mysql_free_result($result);
?>

 

 

home.php

<?
$sql = "SELECT content FROM home WHERE id='1'";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_fetch_array($query);

$content = $result["content"];

echo "<table width=100%><tr><td class=m>$content</td></tr></table>";
?>

 

code.php

<?
# Connecting to mysql table
$result = mysql_query("SELECT * FROM $table order by $order asc");
$loop = mysql_num_rows($result);

for ($i=0; $i<$loop; $i++) {
$myrow = mysql_fetch_array($result);
$title = $myrow["title"];
$content = $myrow["content"];
$id = $myrow["id"];
if($_GET['id']==$id) {
 print "<a class=cd href='index.php?id=$id&table=$table'><span class=code><b>$title</b></span></a> | ";
} else {
 print "<a class=cd href='index.php?id=$id&table=$table'>$title</a> | ";
}
}
$id = $_GET['id'];
$sql = "SELECT * FROM $table WHERE id='$id'";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_fetch_array($query);

$title = $result["title"];
$date = $result["date"];
$content = $result["content"];

echo "</p><table width=100%>";
echo "<tr><td class=nav1>$title</td><td class=nav1 align=right>Created/Updated: $date</td></tr>";
echo "<tr><td class=m colspan=2>";
highlight_string($content);
echo "</td></tr>";
echo "</table>";
echo "<hr class=hr>";
eval("?>".$content);
?>

 

 

pages.php

<?
# Connecting to mysql table
$result = mysql_query("SELECT * FROM $table order by $order asc");
$loop = mysql_num_rows($result);

for ($i=0; $i<$loop; $i++) {
$myrow = mysql_fetch_array($result);
$title = $myrow["title"];
$content = $myrow["content"];
$id = $myrow["id"];
if($_GET['id']==$id) {
 print "<a class=cd href='index.php?id=$id&table=$table'><span class=code><b>$title</b></span></a> | ";
} else {
 print "<a class=cd href='index.php?id=$id&table=$table'>$title</a> | ";
}
}
$id = $_GET['id'];
$sql = "SELECT * FROM $table WHERE id='$id'";
$query = mysql_query($sql) or die(mysql_error());
$result = mysql_fetch_array($query);

$title = $result["title"];
$date = $result["date"];
$content = $result["content"];

echo "</p><table width=100%>";
echo "<tr><td class=nav1>$title</td><td class=nav1 align=right>Created/Updated: $date</td></tr>";
echo "<tr><td class=m colspan=2>$content</td></tr>";
echo "</table>";
?>

Endret av christdi
Lenke til kommentar
Videoannonse
Annonse

ja.. du er vid åpen for sql injection her.

bruk mysql_real_escape_string på alle agrumentene du bruker.

 

det betyr at de kan selecte eller inserte hva man vil i tabellen din, og at php skriptet ditt vil execute det.

 

så lenge du sørger for at tabellene dine ikke inneholder skadelig php kode og at ingen kan sette inn hva de vil er du trygg ;)

Lenke til kommentar

  1. Som sagt, bruk mysql_real_escape_string.
  2. $table og $order (som burde endres til $orderBy) burde godkjennes.
    • $table fra en liste over godkjente tabeller (for eksempel som array) og
    • $order/$orderBy fra en liste over felt i den tabellen.

[*]Du burde ikke legge PHP kode i databasen. Stoler du på dem til å lage PHP kode burde du stole på dem til å bruke ftp eller versjonskontroll.

[*]Du burde erstatte alle split og ereg med preg funksjonene.

[*]Du kan med noen enkle templating og html funksjoner/klasser splitte opp logikk (model) og presentasjon (view). Du kan da bruke index.php for å sette opp logikk og presentasjoner (controller).

[*]Du avslutter et html paragraph (p) element i filen code.php som eg ikke kan se blir startet noe sted.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...