use*_*891 2 javascript php mysql database
出于某种原因,当用户来我的网站玩多人游戏时,会发送对php文件的调用,但数据库从不添加新玩家或更新他们的信息.
使用javascript文件中的以下代码行调用php文件:
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);
Run Code Online (Sandbox Code Playgroud)
这是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;
}
*/
?>
Run Code Online (Sandbox Code Playgroud)
Cha*_*les 11
一些笔记.
pid应该是什么时,行计数将与id列匹配.正确的做法(对于MySQL)将使用自动增量列,这样您就不必担心这个混乱.DELETE FROM查询包含SQL注入漏洞.如果pid不是字符串'false',则永远不会验证它.有人可以摧毁整个positioner桌子.你如何防范它?好...addslashes.这不是代码味道,这是一个代码恶臭. addslashes从来没有,在整个计算历史的任何时候都是正确的使用*.我认为你正在寻找一个真正的数据库转义机制.因为你正在使用残酷的"mysql"界面,你想要的mysql_real_escape_string.lla1和lla2?那些是你能想出的专栏的最佳和最具描述性的名字?我将假设这些是纬度/经度对.SELECT.INSERT,你可能盲目信任$rangerS.SQL注入啊!UPDATE.'true'和字符串'false',但那些来自糟糕的Javascript.考虑让它们提交的1和0来代替.另外,请考虑使用像jQuery这样的现代Javascript库,而不是滚动自己的Ajax位.它将为您节省时间和压力.我认为这里的核心问题实际上是初步pid检查. 我打赌你总是pid从表中得到一个新的或不正确的回复,因为id它不太可能与行数完全匹配.然后你正在INSERT使用"new" 进行盲目的无错误检查pid,但是如果你的索引设计得当,这将失败并出现重复键错误.因此,没有更新. 但这只是猜测. 除了这里的漏洞,我不确定我是否完全理解发生了什么,而且我没有发现任何明显错误的东西.
这里还有另一个问题.我将假设这pid意味着来自上下文的玩家ID.你的代码是盲目信任该请求是由玩家来拥有那pid,但任何人都可以只提出一个要求这里的任何有效的pid,并为人们的移动的结果.我不确定你的意图.
*好吧,也许有人发现addslashes有用一两次......
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |