2012-02-08 10 views
1

私は、目的のCでNSURLRequestクラスを使用してSQLクエリを渡す際に非常に奇妙な問題があります。正しいコンテンツ(JSONフォーマットされた)。ObjCでNSURLRequestを使用してURLでSQLクエリを送信

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 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')を貼り付けると、クエリが正常に実行されます。だから私は実際にPHPスクリプトやURLWithSQLQueryから来ていないので、問題がどこから来ているのか分からず、Objective Cのコードから来ていません。

ご迷惑をおかけして申し訳ございません。あなたの助けに感謝します。

スコット

+0

私のURL文字列はフォーマットの文字列であり、スペースを含む他の文字列を使用していましたが、それらを '+'で置き換える必要があります。とにかく、ありがとう。 – califrench

+0

うん、やってはいけない。 – bryanmac

+0

私はそれを変更して、URLの代わりにPOSTメソッドを使用しています – califrench

答えて

13

は、この質問は回答されているが、私はそれが将来的にこの問題に遭遇誰にでも出て何か、などの質問のポスターを指して価値があると思う:

はないEVERいますあなたのURLを通して実際のSQLを送信してください。

これは、巨大なセキュリティ脆弱性のです。まったくばかげた量の衛生化と検証がなければ、このコードは野生のものになってもサーバーとデータベースを広げて悪用することになります。

私は同じように、あなたがmysql_query()または何にクエリ文字列を突き出す仮定を作るつもりです:あなたがやったので

$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、ハンドルを使用することですそれはすべてあなたのためです)、代わりにprepared statementsを使用することができます。

特にローカルホストで実行しているので、これは重要ではないようですが、質問に示されているのは危険なです。

+0

+1のためにサービスが存在します - その理由はあなたの記憶を抽象して安全にすることです – bryanmac

+0

POST経由で質問を送信して危険ですか?私は自分のプログラムを使用して自分のデータベースに記入するためのツールとしてのみこれを使用しています。 PHPページはインターネットからアクセスできません。 PS:私はPDOを使用しています – califrench

+2

HTTPリクエストでクエリを送信するには、どのように送信しても危険です。 – mrlee

関連する問題