Vad är felet servern eller koden?

Permalänk
Medlem

Vad är felet servern eller koden?

Har en egen server som står hemma hos mig och så har jag ett webbhotell. Jag har testat den här koden på både webbhotellet och min egen server. Min server har klarat av att köra igenom koden på max 3 sek tills nu i veckan då den tar 2 minuter på sig. Jag har ominstallerat hela wamp , men det hjälpte inte. Mitt webbhotell klarar att köra igenom koden på 1 sekund.

Tilläggas kan att servern är snabb i övrigt att ladda bilder och hämta data från mysql men just de här ajax-scriptet verkar den ha problem med.

Koden använder jag för att få statistik på alla mina besökare och ser ut så här.

Jag undrar vad som kan vara fel med min egna server när det nu helt plötsligt tar flera minuter för den att köra igenom koden, när one.com klarar det på 1 sek. Och för en vecka sedan klarade min server det på max 3 sek.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Untitled Document</title> <script type="text/javascript"> function log_visit2() { if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { /*alert(xmlhttp.responseText);*/ } } xmlhttp.open("POST", "besok.php" ,true); xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send("page=index&visit=index&r=<?php error_reporting(0); echo $_SERVER['HTTP_REFERER']; ?>"); } </script> </head> <body onload="log_visit2();"> <div align="center" id="apDiv1"><img src="images/laddar.gif"></div> <script> var ld=(document.all); var ns4=document.layers; var ns6=document.getElementById&&!document.all; var ie4=document.all; if (ns4) ld=document.apDiv1; else if (ns6) ld=document.getElementById("apDiv1").style; else if (ie4) ld=document.all.apDiv1.style; if(ns4){ld.visibility="hidden"; } else if (ns6||ie4) { ld.display="none"; } </script> </body> </html>

här är filen index "pratar" med

<?php setlocale(LC_ALL, "Swedish"); error_reporting(0); $sida = 'sida'; echo '1'; $referer = $_POST['r']; echo '2'; if($_POST['page'] && strlen($_POST['page']) > 2){ $page = $_POST['page']; } else if($_POST['page'] && strlen($_POST['page']) < 3){ $page = 'Google Images'; } else{ $page = ''; } echo '3'; if($sida != ''){ if($referer == ''){ $referer = 'N/A'; } echo '4'; $ip = $_SERVER['REMOTE_ADDR']; $host = gethostbyaddr($_SERVER['REMOTE_ADDR']); if(strpos($host, "bot") === false){ echo '5'; mysql_connect("localhost", "user", "pass")or die("cannot connect server "); mysql_select_db("kobbe92")or die("cannot select DB"); echo '6'; $result = mysql_query (" SELECT * FROM visitors WHERE ip = '$ip' "); echo '6'; if($row = mysql_fetch_array($result)) { if(strtotime("now") < strtotime("+30 min", $row['time'])){ $visningar = $row['sidvis']+1; $oldpage = $row['page']; $newpage = $oldpage.", ".$page; } else{ $visningar = 1; $newpage = $page; } } else{ $newpage = $page; $visningar = 1; } echo '7'; mysql_query (" UPDATE visitors SET sidvis = '$visningar', page = '$newpage' WHERE ip = '$ip' "); echo '8'; function os($opersys) { $oper = $_SERVER['HTTP_USER_AGENT']; return strstr($oper, $opersys); } if(os('Windows') != FALSE) { $os = "<i>Windows</i> \n"; } elseif(os('Linux') != FALSE) { $os = "<i>Linux</i> \n"; } elseif(os('MAC') != FALSE) { $os = "<i>MAC OSX</i> \n"; } else { $os = "N/A"; } echo '9'; function get_browser_($user_agent) { $browsers = array( 'Safari'=>'Safari', 'Opera' => 'Opera', 'Mozilla Firefox'=> '(Firebird)|(Firefox)', 'Galeon' => 'Galeon', 'Android'=>'Android', 'iPhone'=>'iPhone', 'MyIE'=>'MyIE', 'Lynx' => 'Lynx', 'Netscape' => '(Mozilla/4\.75)|(Netscape6)|(Mozilla/4\.08)|(Mozilla/4\.5)|(Mozilla/4\.6)|(Mozilla/4\.79)', 'Konqueror'=>'Konqueror', 'SearchBot' => 'nuhk', 'SearchBot' => 'Googlebot', 'SearchBot' => 'Yammybot', 'SearchBot' => 'Openbot', 'SearchBot' => 'Slurp/cat', 'SearchBot' => 'msnbot', 'SearchBot' => 'ia_archiver', 'Internet Explorer 9' => 'MSIE 9', 'Internet Explorer 8' => 'MSIE 8', 'Internet Explorer 7' => 'MSIE 7', 'Internet Explorer 6' => 'MSIE 6', 'Internet Explorer 5' => 'MSIE 5', 'Internet Explorer 4' => 'MSIE 4', 'Google Chrome'=>'Chrome', ); foreach($browsers as $browser=>$pattern) { if (strpos($user_agent, $pattern)){ $browse = $browser; } } return $browse; } echo ' 10'; $browse = get_browser_($_SERVER['HTTP_USER_AGENT']); if($browse == 'Android'){ $os = 'Android'; $browse = 'Chrome Lite'; } if($browse == 'iPhone'){ $os = 'iOS'; } if (!$browse) { $browse = 'N/A'; } echo ' 11'; if($browse != 'N/A' || $browse != 'SearchBot'){ // ny versionW date_default_timezone_set('Europe/Stockholm'); setlocale(LC_ALL, "Swedish"); $time = strtotime("now"); mysql_connect("localhost", "user", "pass")or die("cannot connect server "); mysql_select_db("kobbe92")or die("cannot select DB"); $ifexists = mysql_query (" SELECT * FROM visitors WHERE ip = '$ip' "); $exists = false; while($ifrow = mysql_fetch_array($ifexists)) { $exists = true; $existtime = $ifrow['time']; } if($exists == false){ mysql_query (" INSERT INTO visitors (sida, time, ip, browser, os, referer, host, sidvis, page) VALUES ('$sida', '$time', '$ip', '$browse', '$os', '$referer', '$host', '1', '$page') "); } else if($exists == true && strftime("%H", $time) > strftime("%H", $existtime)){ mysql_query (" UPDATE visitors SET time = '$time', browser = '$browse', os = '$os', referer = '$referer', sida = '$sida' WHERE ip = '$ip' "); } else{ mysql_query (" UPDATE visitors SET time = '$time', browser = '$browse', os = '$os', sida = '$sida' WHERE ip = '$ip' "); } } } } echo ' 12'; ?>

Permalänk
Medlem

Först och främst, GE FAN i att blockera högermusklick, det är bara jävligt irriterande.

Själva felet beror på att tre filer som inte existerar refereras (orkar inte leta upp vilka), vilket gör att webbläsaren försöker accessa www.server.kobbe92.se/404/notfound.php , som inte svarar => Webbläsaren laddar. Ditt script har förmodligen ingenting med det att göra eftersom att besok.php fungerar bra (förutom att den förmodligen läcker som ett såll om någon attackerar dig. Läs på om bland annat SQL injections.

Permalänk
Medlem

Varför går exakt samma script då blixtsnabbt på one.com?

jag har dessa två filer jag testar och jag syftar inte på min hemsida där scriptet också används, det är där du verkar ha varit inne och kollat.

Här finns scriptet som tar så lång tid att köra: http://server.kobbe92.se/test/index

Permalänk
Medlem

$browsers = array( 'Safari'=>'Safari', 'Opera' => 'Opera', // och så vidare 'Internet Explorer 4' => 'MSIE 4', 'Google Chrome'=>'Chrome', );

Sista raden avslutas med ett kommatecken. Kan det vara problemet måntro?
Servern säger iaf att du har ett problem med att variabeln $browse inte är satt. Lägg till

error_reporting(E_ALL); ini_set('display_errors', '1');

högst upp i din kod så borde du se sådana problem.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Jag har klurat ut felet nu, servern jobbade mycket snabbare när jag kommenterade ut mina error sidor. Nu laddar scriptet på 1 sekund.

#ErrorDocument 403 http://www.server.kobbe92.se/403/403.html
#ErrorDocument 404 http://www.server.kobbe92.se/404/notfound.php
#ErrorDocument 500 http://www.server.kobbe92.se/500/500.html

Men frågan nu är vad jag har för fel i min .htaccess fil? För det ovan har fungerat bra i ett år. Men nu omredigerar den en inte längre om man t.ex skriver in server.kobbe92.se/finnsinte då ska jag ju komma till min 404 sida. Men kommer istället till webbläsarens felsida. (om jag tar bort #)

Permalänk
Medlem

Jag tycker vi kan leka en liten lek, finn minst ett säkerhetshål! Vinnaren får droppa tabellen!

$referer = $_POST['r']; ... mysql_query (" UPDATE visitors SET time = '$time', browser = '$browse', os = '$os', referer = '$referer', sida = '$sida' WHERE ip = '$ip' ");

Visa signatur

citera!

Permalänk
Medlem
Skrivet av Dosshell:

Jag tycker vi kan leka en liten lek, finn minst ett säkerhetshål! Vinnaren får droppa tabellen!

$referer = $_POST['r']; ... mysql_query (" UPDATE visitors SET time = '$time', browser = '$browse', os = '$os', referer = '$referer', sida = '$sida' WHERE ip = '$ip' ");

Man får väl inte köra två frågor genom i mysql_query? Gör det lite mer komplicerat att droppa tabeller, men fortfarande ett ganska stort säkerhetshål.

Permalänk
Medlem
Skrivet av Dosshell:

Jag tycker vi kan leka en liten lek, finn minst ett säkerhetshål! Vinnaren får droppa tabellen!

$referer = $_POST['r']; ... mysql_query (" UPDATE visitors SET time = '$time', browser = '$browse', os = '$os', referer = '$referer', sida = '$sida' WHERE ip = '$ip' ");

Nu behöver man inte förstöra för andra och kan istället förklara hur jag kan fylla igen hållet?

Permalänk
Medlem
Skrivet av kobbe92:

Nu behöver man inte förstöra för andra och kan istället förklara hur jag kan fylla igen hållet?

Givetvis ska inte någon förstöra för dig, det var därför jag uppmärksammade detta i tråden. En ond person avslöjar inte upptäckta säkerhetsbrister som jag gjorde.
Själva säkerhetshålet kallas för sql-injection och är väldigt känt, som tur är går det att skydda sig väldigt lätt (http://php.net/manual/en/security.database.sql-injection.php). Det vanligaste är att man validerar alla extern data (inte bara det som kommer från klienten utan även från databasen) och escapar vissa tecken. Jag brukar rekommendera att man preparerar sina frågor istället (http://php.net/manual/en/pdo.prepared-statements.php) (givetvis ska man validera också!).

Visa signatur

citera!

Permalänk
Medlem

Det Dosshell vill ha sagt är man aldrig ska använda variabler som kommer direkt från användaren utan att behandla dem och se till att de till 100% är vad man vill ha.

Du ska helt enkelt inte skicka $referer, eftersom den tas emot på ett sätt som kan påverkas av användaren, direkt in i din SQL-fråga innan du har sett till att variabeln inte innehåller något farligt.