Почему моя база данных не обновляется, когда кто-то посещает мой сайт? - PullRequest
2 голосов
/ 23 марта 2011

По какой-то причине, когда пользователь заходит на мой сайт, чтобы играть в мультиплеер, отправляется вызов php-файла, но база данных никогда не добавляет нового игрока и не обновляет его информацию.

php файл вызывается со следующей строкой кода из файла javascript:

xmlhttp.open('GET',"xml_http_request.php?mod0="+truckHeading+"&mod1="+newhtr[1]+"&mod2="+absRoll+"&lla0="+lla[0]+"&lla1="+lla[1]+"&lla2="+lla[2]+"&pid="+rCC+"&rangeCheck="+rangeCheck+"&ranger="+ranger+"&namely="+namely+"&message="+message+"&unLoader=false", true);

Вот код php:

<?php
require("db1.php"); //for using live public database
//require("db.php"); //for using local database

$inserter=0;

//assign pid if have not already
$pid=$_GET['pid'];
if($pid=='false'){
  $inserter=1;
  $query="SELECT id FROM positioner";
  $result=mysql_query($query);
  $num_rows=mysql_num_rows($result);
  $i=1;
  while($row=@mysql_fetch_assoc($result)){
    if($i!=$row['id']){ $pid=$i;break; } //take first available id
    $i++;
  }
  if($pid=='false'){ $pid=$num_rows+1; }  //if no hole in id list, take next one higher
  mysql_free_result($result);
}

$unLoader=$_GET['unLoader'];

if($unLoader=='true'){
  $ddb=dbq("DELETE FROM positioner WHERE id = '".$pid."' LIMIT 1;");
}else{

  $dbMi=$_GET['dbMi'];

  $mod0=$_GET['mod0'];
  $mod1=$_GET['mod1'];
  $mod2=$_GET['mod2'];

  $lla0=$_GET['lla0'];
  $lla1=$_GET['lla1'];
  $lla2=$_GET['lla2'];

  $rangeCheck=$_GET['rangeCheck'];
  $namely=addslashes($_GET['namely']);
  if($namely==''){ $namely='x'; }
  $message=addslashes($_GET['message']);

  $rangeCheck='true';
  //only check range every x number of ticks (50, ~3 seconds)?
  // , $rangeCheck is true first time
  if($rangeCheck=='true'){
    $ranger=array();
    //get lat lon of all for determining who is in range
    $query="SELECT id, lla0, lla1 FROM positioner WHERE id != '".$pid."' ";
    $result=mysql_query($query);

    //if distance < 10000, put id in ranger array
    while($row=@mysql_fetch_assoc($result)){
      //leave rangeCheck off for now
      //$di=dister($row['lla0'],$row['lla1'],$lla0,$lla1);
      //if($di<10000){
      $ranger[]=$row['id'];
    //}
    }
    mysql_free_result($result);
    if(count($ranger)==0){
      $rangerS=''; 
    }else{
      $rangerS=implode(",", $ranger);
    }

    //between rangeChecks get ranger array from js
  }else{
    $rangerS=$_GET['ranger'];  // $rangerS: string(for inserting) 
    $ranger=explode(",",$rangerS); // $ranger: array(for looping)
  }

  //insert new row first time
  if($inserter==1){
    $idb=dbq("INSERT positioner (id,mod0,mod1,mod2,lla0,lla1,lla2,ranger,namely,message,model) 
      VALUES ('".$pid."', '".$mod0."', '".$mod1."', '".$mod2."', '".$lla0."', '".$lla1."', '".$lla2."', '".$rangerS."', '".$namely."', '".$message."', '".$dbMi."');");

  }else{
    //update the database with current model data and result of range check
    $udb=dbq("UPDATE positioner SET mod0 = '".$mod0."', mod1 = '".$mod1."', mod2 = '".$mod2."', lla0 = '".$lla0."', lla1 = '".$lla1."', lla2 = '".$lla2."', ranger = '".$rangerS."', namely = '".$namely."', message = '".$message."', model = '".$dbMi."' WHERE id = '".$pid."' LIMIT 1;");
  }

  header("Content-type: text/xml");
  echo '<markers>';
  echo '<marker ranger="'.$rangerS.'" pid="'.$pid.'" />';

  //loop through a number of times equal to number of id's in ranger array
  foreach($ranger as $rang){
    $query="SELECT mod0, mod1, mod2, lla0, lla1, lla2, namely, message, model FROM positioner WHERE id = '".$rang."' ";
    $result=mysql_query($query);
    while ($row=@mysql_fetch_assoc($result)){

      echo '<marker mod0="'.$row['mod0'].'" />';       
      echo '<marker mod1="'.$row['mod1'].'" />'; 
      echo '<marker mod2="'.$row['mod2'].'" />'; 
      echo '<marker lla0="'.$row['lla0'].'" />';     
      echo '<marker lla1="'.$row['lla1'].'" />'; 
      echo '<marker lla2="'.$row['lla2'].'" />'; 
      echo '<marker namely="'.rawurlencode(stripslashes($row['namely'])).'" />';
      echo '<marker message="'.rawurlencode(stripslashes($row['message'])).'" />';
      echo '<marker dbMi="'.$row['model'].'" />';  
    }
  }

  echo '</markers>';

} //end if unLoader

//function for calculating distance between latlon pairs, for range check
/* not necessary for only a few visitors
function dister($lat1,$lon1,$lat2,$lon2){
  $R=6378100;
  $lat1*=pi()/180; 
  $lon1*=pi()/180;
  $lat2*=pi()/180; 
  $lon2*=pi()/180;
  $dLat=$lat2-$lat1;
  $dLon=$lon2-$lon1;
  $a=sin($dLat/2)*sin($dLat/2)
    +cos($lat1)*cos($lat2)*
    sin($dLon/2)*sin($dLon/2);
  $c=2*atan2(sqrt($a),sqrt(1-$a));
  $di=$R*$c;
  $di=round($di,6); 
  return $di;        
}
*/
?>

1 Ответ

11 голосов
/ 23 марта 2011

Некоторые заметки.

  • Блок «назначить pid, если еще не» трагичен.Вы берете все содержимое таблицы, а затем построчно проверяете, нашли ли вы нужную.Код вслепую предполагает , что количество строк будет соответствовать столбцу идентификатора при выборе того, каким должно быть следующее pid.Правильнее всего было бы (для MySQL) использовать столбец с автоинкрементом, чтобы вам не приходилось беспокоиться об этом беспорядке.
  • Ваш запрос DELETE FROM содержит SQL Уязвимость инъекций .Если pid не является строкой 'false', она никогда не будет проверена.Кто-то может уничтожить всю таблицу positioner.Как вы защищаетесь от этого?Ну ...
  • Вы используете addslashes.Это не код запах , это код запах .addslashes никогда, ни разу за всю историю вычислений не было правильной вещи *.Я думаю, что вы ищете настоящий механизм экранирования базы данных.Поскольку вы используете ужасный интерфейс «mysql», вам нужны mysql_real_escape_string.
  • lla1 и lla2?Это лучшие и наиболее описательные названия для столбцов, которые вы могли бы придумать?Я собираюсь предположить, что это пары широта / долгота.
  • Еще раз, у вас есть SQL-инъекция в этом SELECT.
  • И в этом INSERT вы, возможно, слепо доверяете$rangerS.SQL-инъекция, ахой!
  • И в UPDATE.
  • Я также хотел бы кратко рассуждать о строке 'true' и строке 'false', но они происходят из плохого Javascript.Подумайте о том, чтобы вместо них отправлять их как 1 и 0.Также, пожалуйста, рассмотрите возможность использования современной библиотеки Javascript, такой как jQuery, вместо того, чтобы использовать свои собственные биты Ajax.Это сэкономит ваше время и стресс.

Я думаю Основная проблема здесь на самом деле - начальная проверка pid. Я собираюсь сделать ставкучто вы всегда получаете новый или неправильный pid обратно из таблицы, потому что id вряд ли будет идеально соответствовать количеству строк.Затем вы делаете слепую проверку без ошибок INSERT с «новым» pid, но если ваши индексы спроектированы правильно, это приведет к ошибке дублирующегося ключа.Поэтому обновлений нет. Но это всего лишь предположение. Кроме уязвимостей здесь, я не уверен, что полностью понимаю, что происходит, и я не вижу ничего явно неправильного.

Есть еще одна возможная проблема здесь,Я собираюсь предположить, что pid означает идентификатор игрока из контекста.Ваш код вслепую , полагая, что запрос исходит от игрока, которому принадлежит , pid, но любой может просто сделать запрос здесь с помощью любой действительный pid и в результате сделать ход за людей.Я не уверен, что вы намеревались.

* Хорошо, возможно, кто-то нашел addslashes полезным один или два раза ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...