webForumDet fria alternativet

$_get till databasnamn

11 svar · 691 visningar · startad av whitemedia

whitemediaMedlem sedan dec. 20087 inlägg
#1

Tjena!

Hur kan man använda $_get till att bli databasnamnet.

Jag har

$dbnamn = $_GET['id'];
echo $dbnamn;

fungerar hur bra som helst, men när jag kör

$insert = "INSERT INTO $dbnamn (username, password) VALUES ('".$_POST['username']."', '".$_POST['pass']."')";

fungerar det inte.

Hoppas att någon klok ser detta.

GislavedMedlem sedan nov. 20041 740 inlägg
#2

Vad är det som inte fungerar?
Om du vill att databasfrågan ska köras får du väl använda den också, inte bara lägga den i en variabel.

mysql_query($insert);

Sedan vill du antagligen inte plocka ett tabellnamn direkt från en $_GET-variabel utan att verifiera det först.

TroxyMedlem sedan mars 20041 505 inlägg
#3

Får se nu, snackar vi namnet på en databas eller tabell här?
Oavsett vad verkar detta skumt, varför behöver du denna dynamik?
Det öppnar upp alla möjliga säkerhetshål. SQL-injection-varning på högsta nivå! :o

whitemediaMedlem sedan dec. 20087 inlägg
#4

Uppföljning

Så här ser hela skriptet ut.
Jag är ny på detta så det är nog en tabell i databasen jag vill ha ut.

Anledningen är att jag vill att folk ska kunna registrera sig på en och samma sida men hamna i olika tabeller. Beroende på vad det står i URL:en (http://www.dinurl.se/register.php?id=test)
De som registrerar sig från denna sida ska hamna i test tabellen osv.

<?php
$dbnamn = $_GET['id']; // Hämtar in namn från urlen.
echo $dbnamn;

// Connects to your Database
mysql_connect("xxxx.xxxxx.xxx", "xxxxxxx", "xxxxxxxx") or die(mysql_error());
mysql_select_db("xxxxxxxxxx_x") or die(mysql_error());

//This code runs if the form has been submitted
if (isset($_POST['submit'])) {

//This makes sure they did not leave any fields blank
if (!$_POST['username'] | !$_POST['pass'] | !$_POST['pass2'] ) {
die('You did not complete all of the required fields');
}

// checks if the username is in use
if (!get_magic_quotes_gpc()) {
$_POST['username'] = addslashes($_POST['username']);
}
$usercheck = $_POST['username'];
$check = mysql_query("SELECT username FROM $dbmanm WHERE username = '$usercheck'")
or die(mysql_error());
$check2 = mysql_num_rows($check);

//if the name exists it gives an error
if ($check2 != 0) {
die('Sorry, the username '.$_POST['username'].' is already in use.');
}

// this makes sure both passwords entered match
if ($_POST['pass'] != $_POST['pass2']) {
die('Your passwords did not match. ');
}

// here we encrypt the password and add slashes if needed
$_POST['pass'] = md5($_POST['pass']);
if (!get_magic_quotes_gpc()) {
$_POST['pass'] = addslashes($_POST['pass']);
$_POST['username'] = addslashes($_POST['username']);
}

// now we insert it into the database
$insert = "INSERT INTO $dbnamn (username, password) VALUES ('".$_POST['username']."', '".$_POST['pass']."')";
$add_member = mysql_query($insert);
?>

<h1>Registered</h1>
<p>Thank you, you have registered - you may now login</a>.</p>

<?php
}

?>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<table border="0">
<tr><td>Username:</td><td>
<input type="text" name="username" maxlength="60" value="<?php echo $_GET["id"]; ?>" readonly />
</td></tr>
<tr><td>Password:</td><td>
<input type="password" name="pass" maxlength="10" >
</td></tr>
<tr><td>Confirm Password:</td><td>
<input type="password" name="pass2" maxlength="10">
</td></tr>
<tr><th colspan=2><input type="submit" name="submit" value="Register"></th></tr> </table>
</form>

MeleaMedlem sedan juli 20033 147 inlägg
#5

Varför isåfall inte ha en user-tabell med en extra kolumn bestämmer vilken "grupp" man ska hamna i?
Sen håller jag med förgående att det är en rätt stor säkerhetsrisk att ha tabellnamn i URL:en, speciellt när du inte kollar "id" för SQL-injections.

whitemediaMedlem sedan dec. 20087 inlägg
#6

Så här ska vill jag att det ska fungera!

Kunden får ett mail med en url till en flashsida. När han trycker på registrera skickas han till min inloggnings sida med ett tillägg tex(xxx.se/?id=peab).
När han nu registrerar sig hämtar skriptet pead från url:en och ska fyllas i automatiskt istället för att skriva pead som tabellnaman.
se nedan

$insert = "INSERT INTO peab (fornamn, efternamn, email, allergier, ovrigt, password) VALUES

Anledningen är att när en användare klicka på registrera i enannan flashfilen kanske den har url tillägg (xxx.se/?id=lindab) och ska då genom samma inloggningssida fylla i sina uppgifter och sedan haman i en uppgjord tabell som heter lindab.

Jag vill ju inte göra en ny inloggings sida för varje företag

Kanske låter rörigt men som sagt, ny på detta.

Säkerheten spelar inte så stor roll ännu.

MeleaMedlem sedan juli 20033 147 inlägg
#7

Men det är det jag menar. Du kan lägga till en kolumn till i en "user" tabell som heter t.ex. grupp.

$id = $_GET['id'];

mysql_query("insert into 
user (
  fornamn, 
  efternamn, 
  email, 
  allergier, 
  ovrigt, 
  password, 
  grupp) 
values (
  '$fornamn',
  '$efternamn',
  '$email', 
  '$allergier',
  '$ovrigt',
  '$password',
  '$id')
") or die(mysql_error());

Då slipper du ha en tabell för varje användar-grupp.

/r
Och sedan bara hämta ut den informationen som behövs från respektive företag.
Typ.

$sql = mysql_query("select
  fornamn,
  efternamn,
  email,
  grupp
from
  user
where
  grupp = $id
") or die(mysql_error());
whitemediaMedlem sedan dec. 20087 inlägg
#8

Tack för hjälpen!

Det börjar klarna men en sak fattar jag inte
Jag kan hämta och skriva ut tabellen med nedan kod

$query = mysql_query('SELECT * FROM `deltagare` WHERE foretag = "lindab"');

men inte med

$query = mysql_query('SELECT * FROM `deltagare` WHERE foretag = "$id"');

Givet vis har jag koden

$id = "lindab";

också med.

spangoMedlem sedan juni 20008 205 inlägg
#9

Det har att göra med hur PHP expanderar strängar. Ledtråd: Vad händer om du kör echo 'SELECT * FROM `deltagare` WHERE foretag = "$id"'; på sidan?

jmeMedlem sedan maj 20012 237 inlägg
#10

Tror det har göra med att du använder enkla fnuttar i mysql_query och då tolkas $id inte som en variabel.

whitemediaMedlem sedan dec. 20087 inlägg
#11

spango skrev:

Det har att göra med hur PHP expanderar strängar. Ledtråd: Vad händer om du kör echo 'SELECT * FROM `deltagare` WHERE foretag = "$id"'; på sidan?

Den skriver:

SELECT * FROM `deltagare` WHERE foretag = "$id"

überfuzzMedlem sedan apr. 2006409 inlägg
#12

@whitemedia - Du borde läsa om mysql_real_escape_string. Just nu är det nog lite som att lira rysk-roulett om man lägger upp din kod på en server och öppnar databasen.

131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)