发送到服务器时不完整的Base64

时间:2016-03-29 13:49:51

标签: php swift

我正在尝试将图像发送到服务器,但图像应为Base64格式。我正在使用此功能发送它:

func upload_signature_staff(ticket: NSString){
        let defaults = NSUserDefaults.standardUserDefaults()
        let stringOne = defaults.stringForKey(defaultsKeys.staff_id)
        let stringtwo = defaults.stringForKey(defaultsKeys.mst_customer)
        let sig = defaults.stringForKey("staff_signature")
        let request = NSMutableURLRequest(URL: NSURL(string: "http://xxxxxxxxxxxxx/upload.php")!)
        request.HTTPMethod = "POST"
        let postString = "action=add_signature&mst_customer=\((stringtwo!))&ticket=\((ticket))&signature=\((sig!))&current_user=\((stringOne!))&item_type=10"
        print(postString)
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
            guard error == nil && data != nil else {                                                          // check for fundamental networking error
                print("error=\(error)")
                return
            }

            if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {           // check for http errors
                print("statusCode should be 200, but is \(httpStatus.statusCode)")
                print("response = \(response)")
            }

            let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
            print("responseString = \(responseString)")
        }
        task.resume()
        //self.performSegueWithIdentifier("goto_main2", sender: self)
    }

sig变量保存Base64字符串,它正在我的控制台中打印,因此我可以验证字符串是否正确。我也打印postString,检查时签名与Base64字符串匹配也是正确的。但是当我打开phpmyadmin时,我看到我的图像的字段有不完整的Base64字符串,可能只有1/4就在那里。

这是我的PHP代码,如果你想看到它:

<?php
require_once("../c.php");

$action = trim($_POST['action']);

if($action == "add_signature"){
    $mst_customer = trim($_POST['mst_customer']);
    $ticket = trim($_POST['ticket']);
    $signature = trim($_POST['signature']);
    $current_user = trim($_POST['current_user']);
    $item_type = trim($_POST['item_type']);
    $inputtime = time();

    $sql = "INSERT INTO ticket_items SET mst_customer = '$mst_customer', ticket = '$ticket', ticket_item_type = '$item_type', details = '$signature', addedby = '$current_user', lastupdate = '$inputtime' ";

    mysql_query($sql) or die(mysql_error());
}

?>

1 个答案:

答案 0 :(得分:1)

我认为这在评论中得到了解决,但这是一个回顾:

在varchar(255)字段中插入太长(可变长度?)的base64字符串会导致数据丢失。据我所知,增加场地的大小解决了当前的问题。我使用术语“立即”,因为正如@YvesLeBorg在评论中指出的那样,在后端没有输入大小限制的情况下,这肯定会失败。

此外,我不能忽视这样一个事实,即PHP / SQL代码对注入很开放。

$mst_customer = trim($_POST['mst_customer']);传递给"INSERT INTO ticket_items SET mst_customer = '$mst_customer',然后通过mysql_query($sql) or die(mysql_error());执行是危险的!

任何人都可以在$_POST参数中写任何内容,SQL会乐意接受它。准备好的陈述,PDO,输入消毒等都是有原因的。

最后,有一个问题是在base64数据中消失了+个符号。这是缺少url encoding帖子数据的结果。

我认为这总结了一下。