从可可应用程序获取MySql数据库 - PHP桥接

问题描述:

我想通过我正在开发的可可应用程序从我的MySql数据库下载一系列行。我使用一个从我的应用程序接收索引的PHP,并将所有行都发送回该索引。 我的可可代码:从可可应用程序获取MySql数据库 - PHP桥接

NSInteger index = 0; 
NSString *urlString = [NSString stringWithFormat:@"http://localhost/test.php?index=%d&", index]; 

NSArray *items = [NSArray arrayWithContentsOfURL:[NSURL URLWithString: urlString]]; 

NSLog(@"%@", [items description]); 

当PHP收到GET变量index运行这段代码:

$index = $_GET['index']; 
$Keys = array(...); 

mysql_connect($Host, $User, $Password) or die("Unable to connect to database"); 
mysql_select_db($Database) or die("Unable to select database"); 


$result = mysql_query("SELECT * FROM transactions where id > $index ORDER BY id"); 

$plist = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
$plist .= "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"; 
$plist .= "<plist version=\"1.0\">\n"; 
$plist .= "<array>\n"; 

while($row = mysql_fetch_array($result)) { 
    $plist .= "\t<dict>\n"; 

    foreach($Keys as $key){ 
     $plist .= "\t\t<key>$key</key>\n"; 
     $plist .= "\t\t<string>$row[$key]</string>\n"; 
    } 

    $plist .= "\t</dict>\n"; 
} 

$plist .= "</array>\n"; 
$plist .= "</plist>"; 

echo $plist; 

unset($_GET['index']); 

如果有多达来自index 30行,最后ID这一切工作正常的数据库!如果从我的可可代码中,我设置了index来请求多达30行或者我将index设置为零(以请求所有数据库)... NSArray对象不包含任何内容!

我在做什么错?

对不起!我自己解决了!有一个编码问题! 只是改变:

utf8_encode($row[$key]) 

,我已经解决了这个问题!

这不会回答你的问题,但你的代码是广泛开放的SQL注入攻击。解决它的方法是一个非常简单的的sprintf:

$result = mysql_query(sprintf("SELECT * FROM transactions where id > %d ORDER BY id", intval($index)));

现在,如果恶意用户试图注入文本,在$指标变量,则INTVAL + sprintf的组合将只是把它变成数字0,从而保护你的分贝。

+0

感谢您的建议! – BitDrink 2009-07-28 11:20:25