[PHP] Probleem met cronjob

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik gewoon getdata.php aanroep dan werkt het en schrijft hij de playlist weg in mijn database.

Maar ik gebruik een cronjob die php /home/sunreeze/public_html/am/getdata.php aanroept. Die wordt wel uitgevoerd maar toch werkt het niet, het lijkt alsof die cronjob een probleem heeft met die header die input.php aanroept?


getdata.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$rnd = rand(1, 9999999);
$returned_content = get_data('http://www.cm-server.mine.nu/ajoinmusic/scripts/cm-onair.php?rand='.$rnd);
header("Location: input.php?rand=".$rnd.$returned_content);
function get_data($url)
{
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
?>
input.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
$tijd4 = $_GET["tijd4"];
$artiest4 = $_GET["artiest4"];
$titel4 = $_GET["titel4"];

$tijd5 = $_GET["tijd5"];
$artiest5 = $_GET["artiest5"];
$titel5 = $_GET["titel5"];

$tijd6 = $_GET["tijd6"];
$artiest6 = $_GET["artiest6"];
$titel6 = $_GET["titel6"];


$con = mysql_connect("localhost","$$$$$","$$$$$$");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  echo "neen";
  }

mysql_select_db("sunreeze_carnaval", $con);

if(!mysql_num_rows(mysql_query("SELECT id FROM ajoinmusic WHERE date = CURDATE() AND time ='$tijd4'"))){
mysql_query("INSERT INTO ajoinmusic (date, time, artist, track)VALUES (CURDATE(),'$tijd4', '$artiest4', '$titel4' )");
}

if(!mysql_num_rows(mysql_query("SELECT id FROM ajoinmusic WHERE date = CURDATE() AND time ='$tijd5'"))){
mysql_query("INSERT INTO ajoinmusic (date, time, artist, track)VALUES (CURDATE(),'$tijd5', '$artiest5', '$titel5' )");
}
if(!mysql_num_rows(mysql_query("SELECT id FROM ajoinmusic WHERE date = CURDATE() AND time ='$tijd6'"))){
mysql_query("INSERT INTO ajoinmusic (date, time, artist, track)VALUES (CURDATE(),'$tijd6', '$artiest6', '$titel6' )");
}


mysql_close($con);

?>

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 19-09 16:54

DexterDee

I doubt, therefore I might be

Ten eerste is het eenvoudig in te bouwen dat je script checkt of hij via de commandline is gestart of niet:
PHP:
1
$isCli = substr(php_sapi_name(), 0, 3) == 'cli';

Hiermee kun je dus selectief wel of niet de header mee doorsturen. De header meesturen in een CLI script zal het script overigens niet laten crashen.

Ten tweede, onder welke user draait die cronjob? Onder de webserver is het apache, maar met een cronjob kun je dat zelf instellen. Als de user waaronder je draait niet genoeg rechten heeft, dan gaat het natuurlijk mis.

En tot slot nog een aantal tips:
PHP:
1
2
  die('Could not connect: ' . mysql_error());
  echo "neen";

Na een die gebeurt er niks meer, ook geen echo ;)

PHP:
1
$tijd4 = $_GET["tijd4"];

Die variabele ga je later gebruiken in je SQL query, zonder te 'sanitizen', dus ben je vatbaar voor SQL injections. Dit soort variabelen kun je het beste mysql_real_escapen voordat je ze in de query gebruikt

PHP:
1
header("Location: input.php?rand=".$rnd.$returned_content);

Dat random getal is leuk, maar er gaan geheid dubbele nummers tussen zitten over de tijd dat de cache leeft. Een beter plan is om de juiste headers mee te geven om de browser te vertellen dat de pagina niet gecached mag worden:
PHP:
1
2
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

[ Voor 56% gewijzigd door DexterDee op 20-01-2010 17:51 . Reden: Nog wat tips toegevoegd ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

Verwijderd

Luistert een cron wel naar een header? Ik zou dit zelf oplossen zonder de header én de data escapen en niet rechtstreeks in de query gooien. :9

[ Voor 58% gewijzigd door Verwijderd op 20-01-2010 17:43 ]


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Uhm, tja. Een cron job is niet meteen een http client die luistert naar response headers... Maak dan een php script welke een http client implementeert en ga daarmee je url's opvragen. Of doe het slimmer en schrijf één (veilig!) script.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
DexterDee schreef op woensdag 20 januari 2010 @ 17:39:
Ten eerste is het eenvoudig in te bouwen dat je script checkt of hij via de commandline is gestart of niet:
PHP:
1
$isCli = substr(php_sapi_name(), 0, 3) == 'cli';


Ten tweede, onder welke user draait die cronjob? Onder de webserver is het apache, maar met een cronjob kun je dat zelf instellen. Als de user waaronder je draait niet genoeg rechten heeft, dan gaat het natuurlijk mis.
De cronjob beschikt over voldoende rechten, want andere jobs zoals bv een perl job voert hij wel uit.

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 19-09 16:54

DexterDee

I doubt, therefore I might be

Ik denk dat ik het probleem al zie:
Je roept getdata.php aan in de cronjob. Je verwacht vervolgens dat er een header redirect plaatsvindt, maar dat is alleen iets wat browsers snappen, niet CLI scripts. In plaats van die header redirect zul je de code in input.php toch echt moeten includen in getdata.php

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb al je tips net toegepast, al bedankt hiervoor.

Ja ik ben er ook zeker van dat het probleem daar zit, maar ik heb die input.php echt nodig om die querystring uit te lezen die ik terugkrijg van die url.

Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Dan maak je d'r toch een execute() van ofzo? Aangenomen dat die input.php ook net als je cronjob-PHP een uitvoerbaar scriptje is. Alleen dan moet je je informatie wel als argument meegeven en uitlezen in $_SERVER["argv"] ipv als query-string.

[ Voor 79% gewijzigd door Osiris op 20-01-2010 18:15 ]


Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 15:55
Verwijderd schreef op woensdag 20 januari 2010 @ 18:12:
Ja ik ben er ook zeker van dat het probleem daar zit, maar ik heb die input.php echt nodig om die querystring uit te lezen die ik terugkrijg van die url.
Nee, dat heb je niet

PHP:
1
2
3
4
5
6
7
8
<?php
$array = explode("&", $returned_content);

for ($i=1; $i <= count($array); $i++) {
    $array2 = explode("=", $array[$i]);
    $$array2[0] = urldecode($array2[1]);
}
?>

Dit maakt de variabelen gewoon in je huidige document beschikbaar.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php
$rnd = rand(1, 9999999);
$returned_content = get_data('http://www.cm-server.mine.nu/ajoinmusic/scripts/cm-onair.php?rand='.$rnd);
function get_data($url)
{
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

$array = explode("&", $returned_content);

for ($i=1; $i <= count($array); $i++) {
    $array2 = explode("=", $array[$i]);
    $$array2[0] = urldecode($array2[1]);
}


$con = mysql_connect("localhost","$$$$$","$$$$$$");
if (!$con)
{
    die('Could not connect: ' . mysql_error());
    echo "neen";
}

mysql_select_db("sunreeze_carnaval", $con);

if(!mysql_num_rows(mysql_query("SELECT id FROM ajoinmusic WHERE date = CURDATE() AND time ='$tijd4'"))){
    mysql_query("INSERT INTO ajoinmusic (date, time, artist, track)VALUES (CURDATE(),'$tijd4', '$artiest4', '$titel4' )");
}

if(!mysql_num_rows(mysql_query("SELECT id FROM ajoinmusic WHERE date = CURDATE() AND time ='$tijd5'"))){
    mysql_query("INSERT INTO ajoinmusic (date, time, artist, track)VALUES (CURDATE(),'$tijd5', '$artiest5', '$titel5' )");
}
if(!mysql_num_rows(mysql_query("SELECT id FROM ajoinmusic WHERE date = CURDATE() AND time ='$tijd6'"))){
    mysql_query("INSERT INTO ajoinmusic (date, time, artist, track)VALUES (CURDATE(),'$tijd6', '$artiest6', '$titel6' )");
}


mysql_close($con);

?>

En dan heb je alles in 1 script.

Maar hou er wel rekening mee dat je de gegevens die je van de externe server krijgt niet kan vertrouwen , je hebt op deze manier nog geen enkele manier van data controle, en bent dus vatbaar voor exploits.

[disclaimer]
Ik weet dat $$var nu niet bepaald netjes PHP is, maar het is volgens mij in dit voorbeeld wel enigszins gerechtvaardigd om te gebruiken.
[/disclaimer]

[ Voor 4% gewijzigd door eXcyle op 20-01-2010 18:21 . Reden: disclaimer ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

De makkelijkste hack is natuurlijk "wget http://localhost/pad/naar/script.php" als taak in te stellen. Misschien niet helemaal netjes in alle situaties, maar wanneer een script zowel via de browser als ook via een cronjob moet werken (zoals hier blijkbaar) is het niet eens zo'n gek idee. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

-

[ Voor 100% gewijzigd door Verwijderd op 20-01-2010 18:22 ]


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 19-09 16:54

DexterDee

I doubt, therefore I might be

eXcyle schreef op woensdag 20 januari 2010 @ 18:18:
[...]

PHP:
1
2
3
4
5
6
$array = explode("&", $returned_content);

for ($i=1; $i <= count($array); $i++) {
    $array2 = explode("=", $array[$i]);
    $$array2[0] = urldecode($array2[1]);
}


[disclaimer]
Ik weet dat $$var nu niet bepaald netjes PHP is, maar het is volgens mij in dit voorbeeld wel enigszins gerechtvaardigd om te gebruiken.
[/disclaimer]
Close, but no sigar ;)

Voor dat stukje functionaliteit heeft PHP zijn eigen ingebouwde functie waarmee het eenvoudig in 1 regel kan :)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 15:55
Hmm.. die kende ik niet , das inderdaad nog makelijker.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Yep nu werkt het perfect met de cronjob, bedankt!

PHP:
1
2
3
4
5
6
$array = explode("&", $returned_content);

for ($i=1; $i <= count($array); $i++) {
    $array2 = explode("=", $array[$i]);
    $$array2[0] = urldecode($array2[1]);
}


Dus dit stukje code zorgt er eigenlijk voor dat ik die input.php niet meer nodig heb?

Acties:
  • 0 Henk 'm!

  • eXcyle
  • Registratie: Juni 2002
  • Laatst online: 15:55
Verwijderd schreef op woensdag 20 januari 2010 @ 18:29:
Yep nu werkt het perfect met de cronjob, bedankt!

PHP:
1
2
3
4
5
6
$array = explode("&", $returned_content);

for ($i=1; $i <= count($array); $i++) {
    $array2 = explode("=", $array[$i]);
    $$array2[0] = urldecode($array2[1]);
}


Dus dit stukje code zorgt er eigenlijk voor dat ik die input.php niet meer nodig heb?
Ja, maar maar gezien php er dus schijnbaar ook een kant en klare functie voor heeft zoals DexterDee aangaf
DexterDee schreef op woensdag 20 januari 2010 @ 18:23:
[...]

Close, but no sigar ;)

Voor dat stukje functionaliteit heeft PHP zijn eigen ingebouwde functie waarmee het eenvoudig in 1 regel kan :)
Kan je dat hele blok door deze regel vervangen.
PHP:
1
2
3
<?php
parse_str($returned_content);
?>

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 22:52

MueR

Admin Tweakers Discord

is niet lief

En parse_str gebruiken is zeker aan te raden. Variable variables zijn in 99 van de 100 gevallen totaal nutteloos. Dit is een van die 99. Tenzij je verdomd goed weet waar je mee bezig bent, moet je ver van variabele variabelen blijven en met alle respect voor TS, dat weet hij niet.

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1