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...?
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/
Kotikoneella tökkäsi aina tuohon virhe-ilmoitukseen, mutta nyt sivuutti sen kokonaan...
passthru () on poistettu turvallisuussyistä......? Korvikkeita??
Oletko aivan varma, että haluat välittää $_POST['dump']:n sisällön suoraan komentoriville?
https://www.php.net/manual/en/function.passthru.
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.
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
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.
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-
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.
"mysql -q -h {$host} -u {$user} -p{$pass} {$dbname} < {$filename}";
Pitäisikö -p muokkaimen jälkeen olla välilyönti, kuten on muissakin?
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.)
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.
Kokeile jotain valmispakettia, esim. xampp on ainakin ollut itsellä käytössä ja ihan hyvä on ollut :)
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....
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ä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.