& 符号破坏了 json

Mik*_*mar 0 json swift

我有一个 swift 5 应用程序,可以发布数据来更新 mysql 表。它工作得很好,只是用户注意到在描述字段中使用&符号会导致应用程序更新功能失败。

这是组件结构

import Foundation

struct Component: Codable {

  var sku, qty, desc, condition: String

  enum CodingKeys: String, CodingKey {
    case sku = "Sku"
    case qty = "Qty"
    case desc = "Desc"
    case condition = "Condition"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 swift 5 代码来创建 post 参数

    var newCompUpload = [Component]()
    newCompUpload.append(newComp)

    let jsonData = try! JSONEncoder().encode(newCompUpload) 
    let uploadData = String(data: jsonData, encoding: .utf8)!

    let defaults = UserDefaults.standard
    let UserID = defaults.integer(forKey: "UserID")

    let postParameters1 = "mode="+mode+"&ShipmentID="+self.ShipmentID
    let postParameters2 = "&Contents="+uploadData+"&UserID=\(UserID)"
    let postParameters = postParameters1 + postParameters2 // + postParameters3
    request.httpBody = postParameters.data(using: String.Encoding.utf8, allowLossyConversion: false)
Run Code Online (Sandbox Code Playgroud)

下面是 request.httpBody 的示例,其中带有与号,它会破坏 json

mode=saveContents&ShipmentID=8702&Contents=[{"Qty":"1","Sku":"54657","Desc":"test & test","Condition":""}]&UserID=1437
Run Code Online (Sandbox Code Playgroud)

这看起来应该可以正常到达服务器。但事实并非如此。以下是在原始 $_POST['Contents'] 参数中将其发送到服务器的内容

[{"Qty":"1","Sku":"54657","Desc":"test  
Run Code Online (Sandbox Code Playgroud)

显然,& 符号处的 json 被破坏了。我不太确定是什么破坏了它,或者我是否可以在快速交付中更改任何内容以使其正确传输

Ale*_*ica 5

您刚刚亲身体验了 2 门编程课程:

  1. 切勿相信具有技术意义的上下文中的用户内容(例如,某些字符在 URL 上下文中具有特殊含义)。如果人们能够将这一点牢记在心,那么 SQL 注入攻击就永远不会存在。
  2. 不要使用字符串插值创建自己的查询参数。真的很容易出错。就您而言,您忘记对字符串进行 URL 编码。相反,您应该只使用一个库,它会为您正确完成所有操作。在这种情况下,Foundation 已URLComonents内置,您可以使用它来正确编码数据并将其构造为 URL,而不是手动插入字符串。