Php 在ObjC中使用NSURLRequest在URL中发送SQL查询

Php 在ObjC中使用NSURLRequest在URL中发送SQL查询,php,objective-c,sql,get,nsurlrequest,Php,Objective C,Sql,Get,Nsurlrequest,在objective C中尝试使用NSURLRequest类传递和SQL查询时,我遇到了一个非常奇怪的问题。我能够发送一个简单的查询,该查询可以工作并返回正确的JSON格式的内容。 这是我的密码: NSString *URLWithSQLQuery = [NSString stringWithString:@"http://localhost/querydatabase.php?query=INSERT+INTO+Table+(ID,Column1,Column2,Column3,Column4

在objective C中尝试使用NSURLRequest类传递和SQL查询时,我遇到了一个非常奇怪的问题。我能够发送一个简单的查询,该查询可以工作并返回正确的JSON格式的内容。 这是我的密码:

NSString *URLWithSQLQuery = [NSString stringWithString:@"http://localhost/querydatabase.php?query=INSERT+INTO+Table+(ID,Column1,Column2,Column3,Column4,Column5,Column6,Column7,Column8)+VALUES+(NULL,'a','b','','c','d','','1','2')"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLWithSQLQuery]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *data = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSLog(@"%@", data);
这不会将虚拟值插入表中。 以下代码返回正确的内容:

NSString *URLWithSQLQuery = [NSString stringWithString:@"http://localhost/querydatabase.php?query=SELECT+*+FROM+Table"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLWithSQLQuery]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSString *data = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
NSLog(@"%@", data);
当我将url粘贴到浏览器中时,查询会正确执行。所以我真的不知道问题来自哪里,因为它既不是来自PHP脚本或URLWithSQLQuery,也不是来自我的目标C代码

任何想法都将不胜感激。谢谢大家的帮助


斯科特(Scott)

这个问题已经得到了回答,但我认为值得向将来遇到这个问题的任何人指出一些东西,以及这个问题的海报:

永远不要通过URL发送实际的SQL 这是一个巨大的安全漏洞。如果没有完全荒谬的清理和验证,这段代码在被释放到野外时,将使您的服务器和数据库完全处于可利用状态

我将假设您将查询字符串插入mysql\u查询或其他任何内容,例如:

$query = mysql_query($_GET['query']);
任何找到你的API的人都不需要破解它,因为你已经为他们做了所有艰苦的工作。这就像是在建诺克斯堡,却让前门敞开着。这座建筑可以抵御攻击,但任何知道的人都可以走进来

他们只需将URL更改为他们喜欢的任何查询:

// Delete one of your databases
http://your-server.com/querydatabase.php?query=DROP+DATABASE+DBNAME

// Create a new user account to log in directly
http://your-server.com/querydatabase.php?query=GRANT+ALL+PRIVILEGES+ON+*.*+TO+'bobby'%40%25+IDENTIFIED+BY+'password'
PHP代码需要为要保存的数据获取一系列单独的参数,并且在将这些参数插入预构建的SQL查询之前,需要确保它们是合理和有效的。这严重限制了但并不能阻止无良个人利用服务器做坏事的所有机会

作为一个非常基本的例子,你已经拥有了:

// get records from the database
http://your-server.com/querydatabase.php?query=list

if ($_GET['query'] == 'list') {
    mysql_query("SELECT * FROM TABLE");
}

// you would actually make a POST request to do this
http://your-server.com/querydatabase.php?query=save&column1=value1&column2=value2...

if ($_GET['query'] == 'save') {
    $column1 = mysql_real_escape_string($_GET['column1']);
    $column2 = mysql_real_escape_string($_GET['column2']);

   // only want column 1 to be an integer?
   if (!ctype_digit($column1)) die("Column 1 is not a number");

   mysql_query("INSERT INTO TABLE (column1, column2) VALUES ($column1, $column2)");
}
首选的、稍微高级一点的方法是抛弃mysql,使用mysqli或PDO或ORM,这些都是为您处理的,因此您可以改用它


这似乎不重要,特别是因为您正在本地主机上运行它,但问题中演示的内容是危险的。

这个问题已经得到了回答,但我认为值得向将来遇到这个问题的任何人指出一些东西,以及问题的海报:

永远不要通过URL发送实际的SQL 这是一个巨大的安全漏洞。如果没有完全荒谬的清理和验证,这段代码在被释放到野外时,将使您的服务器和数据库完全处于可利用状态

我将假设您将查询字符串插入mysql\u查询或其他任何内容,例如:

$query = mysql_query($_GET['query']);
任何找到你的API的人都不需要破解它,因为你已经为他们做了所有艰苦的工作。这就像是在建诺克斯堡,却让前门敞开着。这座建筑可以抵御攻击,但任何知道的人都可以走进来

他们只需将URL更改为他们喜欢的任何查询:

// Delete one of your databases
http://your-server.com/querydatabase.php?query=DROP+DATABASE+DBNAME

// Create a new user account to log in directly
http://your-server.com/querydatabase.php?query=GRANT+ALL+PRIVILEGES+ON+*.*+TO+'bobby'%40%25+IDENTIFIED+BY+'password'
PHP代码需要为要保存的数据获取一系列单独的参数,并且在将这些参数插入预构建的SQL查询之前,需要确保它们是合理和有效的。这严重限制了但并不能阻止无良个人利用服务器做坏事的所有机会

作为一个非常基本的例子,你已经拥有了:

// get records from the database
http://your-server.com/querydatabase.php?query=list

if ($_GET['query'] == 'list') {
    mysql_query("SELECT * FROM TABLE");
}

// you would actually make a POST request to do this
http://your-server.com/querydatabase.php?query=save&column1=value1&column2=value2...

if ($_GET['query'] == 'save') {
    $column1 = mysql_real_escape_string($_GET['column1']);
    $column2 = mysql_real_escape_string($_GET['column2']);

   // only want column 1 to be an integer?
   if (!ctype_digit($column1)) die("Column 1 is not a number");

   mysql_query("INSERT INTO TABLE (column1, column2) VALUES ($column1, $column2)");
}
首选的、稍微高级一点的方法是抛弃mysql,使用mysqli或PDO或ORM,这些都是为您处理的,因此您可以改用它


这似乎不重要,特别是因为您正在本地主机上运行它,但问题中演示的内容是危险的。

没关系,我的URL字符串是一个格式为的字符串,它使用了其他字符串,其中包含我需要用“+”替换的空格。无论如何,谢谢。我更改了它,现在使用POST方法而不是URL。没关系,我的URL字符串是一个格式为的字符串,它使用了其他字符串,其中包含空格,我需要用“+”替换这些空格。不管怎样,谢谢。我更改了它,现在使用POST方法而不是URL+1作为dont(这就是服务存在的原因)来抽象和保护您的存储。是否通过POST发送查询?我只是把它作为一个工具,用我的程序来填充我的数据库。无法从Internet访问php页面。PS:我正在使用PDO通过HTTP请求发送查询是危险的,无论您如何发送它。+1对于dont(这就是服务存在的原因)来说,抽象和保护您的存储是通过POST-Digital发送查询吗?我只是把它作为一个工具,用我的程序来填充我的数据库。无法从Internet访问php页面。PS:我使用PDO,通过HTTP请求发送查询是危险的,无论您如何发送查询。