Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sql Dump

Sivun loppuun

pistemies [29.08.2008 17:03:03]

#

Pikku ongelma. Olen tekemässä (oikeaastaan tehnyt jo) skriptiä, joka muuttaa csv-tiedoston sisällön sql-tiedostoksi.
En saanut tuota lisättyä mysql-kantaan.
Missähän piilee vika?
Dump-tiedoston sisältö:

<?php
class Dump
{
    private $cmd = '';
    private $filen = '';


    function Dump($host, $user, $pass, $dbname, $filename)
    {
        $this->cmd = "mysql -q -h {$host} -u {$user} -p{$pass} {$dbname} < {$filename}";
        $this->filen = $filename;
    }

    function tomysql()
    {
	      if(!file_exists($this->filen)){
		      $error = "Tiedostoa ".$this->filen." ei löydy!";
	      }
        passthru($this->cmd, $retval);

        if($retval)
        {
            exit($retval.": Tuntematon virhe. ".$error);
        }

    }
}


$to = new Dump(MYSQL_PALVELIN, MYSQL_PALVELIN, MYSQL_PALVELIN, DATABASE, $_POST['dump']);
$to->tomysql();
?>

sql-tiedostossa on seuraavankaltaisia rivejä noin 1000 kpl;

INSERT INTO Cat VALUES (2,'1','1','','Tekstiä','Tässäkin on tekstiä','11.90','','','','','Testaampa vaan tätä, tässä pitempää tekstiä hurumykken.');

Mysql-tunnukset ovat oikein, samoin sql-tiedosto löytyy ja taulu Cat.

Ps. Taulun rakenne myös vastaa tuota, yhtä monta saraketta löytyy.
En ole ennen tehnyt vastaavaa ohjelmaa, joten tarviiko sql-lauseessa olla aina taulun luonti skripti, vaikka se jo olisi olemassa...?

pistemies [29.08.2008 18:31:29]

#

Yksi bugi löydetty:

MYSQL_PALVELIN, MYSQL_PALVELIN, MYSQL_PALVELIN

:)

Mutta vieläkään ei toimi.

Uusi testi juuri tehty verkkosivuilla ja ilmoitti seuraavaa:

Warning: passthru() has been disabled for security reasons in /usr/home/xxxxx/d/xxxx/xxx/xx/xxx/inc/mysql_dump.php on line 17

Kotikoneella tökkäsi aina tuohon virhe-ilmoitukseen, mutta nyt sivuutti sen kokonaan...

passthru () on poistettu turvallisuussyistä......? Korvikkeita??

Chiman [29.08.2008 19:57:22]

#

Oletko aivan varma, että haluat välittää $_POST['dump']:n sisällön suoraan komentoriville?

https://www.php.net/manual/en/function.passthru.php

lainaus:

Warning

When allowing user-supplied data to be passed to this function, use escapeshellarg() or escapeshellcmd() to ensure that users cannot trick the system into executing arbitrary commands.

Tuo dump-post-muuttuja voisi olla vaikka "; rm -rf ~;" tms.

pistemies [29.08.2008 21:45:46]

#

Chiman kirjoitti:

Oletko aivan varma, että haluat välittää $_POST['dump']:n sisällön suoraan komentoriville?

https://www.php.net/manual/en/function.passthru.php

lainaus:

Warning

When allowing user-supplied data to be passed to this function, use escapeshellarg() or escapeshellcmd() to ensure that users cannot trick the system into executing arbitrary commands.

Tuo dump-post-muuttuja voisi olla vaikka "; rm -rf ~;" tms.

Varmahan ei voi olla (tai ei sais olla) kovin mistään. :)
Mutta tässä on kyse ohjelmasta, joka ei tule ulkopuoliseen käyttöön, vaan se liittyy erään tulevan mysql-ohjelmani admin-sivulle. "Käyttäjät" ei voi temppuilla, koska heitä ei ole.
Tämä skripti on sitä varten, jos jollakin webmasterilla on tarvetta siirtää kerralla vaikka kymmenentuhatta riviä omaan tietokantaan, niin nopeuttaisi hommaa. (Kerran siirsin yli 20000 riviä kerralla kotikoneeltani rivi kerrallaan, vei aikaa pitkälti yli 10 minuuttia,kotikoneeni max_execution_time on asetettu lukemaan 1500 = 25 minuuttia!)

Tämä taas:

"mysql -q -h {$host} -u {$user} -p{$pass} {$dbname} < {$filename}";

on aikaisemmin tietääkseni toiminut

Chiman [29.08.2008 22:38:35]

#

Ok, autentikointia ei kuitenkaan tuossa (kokonaiselta vaikuttaneessa) pätkässä ollut, joten halusin varoittaa.

Etkö pääse kirjautumaan palvelimelle ssh:lla? Sillä tuo mysql-komento olisi helpointa ja turvallisinta suorittaa.

Wizard [30.08.2008 09:15:32]

#

Jos kerran teet tuot PHP:llä, niin voit saman tien kirjoittaa suoraan MySQL adapterin jne. Ei mitään shell scriptejä jos kerran PHP on käytössä. Suomeksi: älä sotke shelliä ja PHP scriptejä, koska siitä ei tule koskaan hyvää.

-W-

pistemies [30.08.2008 11:32:55]

#

Kyllä tästä tosiaan tulee php&mysql ohjelma. Onko kellään tiedossa vaikka ilmaista mysql-palvelinta, jossa voisi testailla tällaisia hommia?
Vaikuttaa siltä, että int2000, jota käytän, on estänyt passthru-funktion käytön.(Vai käänsikö Google tuon virheilmoituksen ihan pieleen?). Ohjelman testaaminen ei siellä silloin onnistu.

kayttaja-2791 [30.08.2008 11:42:07]

#

"mysql -q -h {$host} -u {$user} -p{$pass} {$dbname} < {$filename}";

Pitäisikö -p muokkaimen jälkeen olla välilyönti, kuten on muissakin?

Chiman [30.08.2008 11:47:18]

#

JTS kirjoitti:

Pitäisikö -p muokkaimen jälkeen olla välilyönti, kuten on muissakin?

Ei. Pelkkä "-p" aiheuttaa erillisen salasanakyselyn komennon jälkeen. (Hyödyllinen toiminto silloin, kun haluaa välttää salasanan jäämisen komentohistoriaan.)

pistemies [30.08.2008 22:42:49]

#

Vaikuttaa siltä, että aika monella palvelimella passthru-funktio on listattau disable_functions -asetuksissa.
Kun saisi tuon MySqlin kotikoneelle. Muutaman kerran olen yrittänyt sitä asentaa, mutta en ole vielä siinä onnistunut.

temu92 [30.08.2008 23:09:03]

#

Kokeile jotain valmispakettia, esim. xampp on ainakin ollut itsellä käytössä ja ihan hyvä on ollut :)

pistemies [31.08.2008 19:55:29]

#

Tämä on luonteeltaan sellainen, ettei siihen valmispaketit välttämättä käy.
Olen muuttanut tätä siten, että ohjelma tarkistaa "ini-funktioilla", onko passthru funktio estetty vai ei ja lisää asiasta tiedon vakiomuuttujaan PASSTHRU_INFO. Jos sen arvo on 2, passthru funktiota voi käyttää ja siihen liittyvät Muunna sql-tiedostoksi yms. painikkeet näytetään adminsivulla.
Pitäisi vaan jostakin löytää palvelin, jossa tuota ohjelmaa voi testata eli passthru on sallittu. Nebula ja Dreonia ovat ainakin sellaisia, mutta itsellä ei ole niissä levytilaa....

pistemies [02.09.2008 21:19:42]

#

Pääsin testaamaan tätä erään kaverin levytilassa. Tuloksena oli, että tuo $retval muuttuja tulostaa virheen numeroksi 127.
En ole saanut selville, mistä tuo voisi johtua. Onko kokemusta kyseisestä virheestä?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta