亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

何時(以及為什么何時)以及我應該如何在 php 中清理來自 POST JSON 的數據

何時(以及為什么何時)以及我應該如何在 php 中清理來自 POST JSON 的數據

PHP
呼喚遠方 2022-01-08 17:41:20
在過去的幾天里,我閱讀了很多關于使用 PHP 對輸入和輸出數據進行清理以防止(最突出)XSS 和 SQL 注入的資源,以及關于 SO 的一堆問題。然而,在這一點上,我覺得我對我應該做什么和不應該做什么感到更加困惑和不安全,部分原因是一些相反的信息,例如我讀過很多次我沒有讀過mysqli_real_escape_string如果我使用準備好的語句,則需要使用或任何其他形式的輸入凈化,其他消息來源說我無論如何都應該使用它,甚至應該像這樣凈化它;蘋果的這個頁面相當粗略地(?)討論了這個話題;等等。因此,我真的很感激我應該做的一些澄清 - 最好但不一定,由在該領域(服務器端安全)有一些經驗的人,例如在這個領域工作,已經完成了對此進行了大量研究,甚至可能站在攻擊者的一邊(?)。為了更好地了解我的情況,我將盡可能簡潔地回顧一下:我目前正在使用 Swift (iOS) 編寫應用程序,并且需要將一些數據發送到我的服務器,并使用 SQL 將其保存在表中,并且可以被其他用戶檢索(例如博客)。為此,我通過 POST 將編碼為 JSON 的數據發送到我的服務器(“myphp.php”;使用 Alamofire,不過這應該不是很重要)并在那里對其進行解碼。這是我不確定是否應該以某種方式清理我的數據的第一個地方(參考我上面鏈接的問題)。無論如何,然后我繼續使用準備好的語句將它插入到表中(MySQL,所以沒有任何模擬)。此外,我還希望我輸出的數據可以在 html 中使用,或者更確切地說,整個 PHP 也可以用于 AJAX。這是我的意思的一個例子:// SWIFT// set parameters for requestlet parameters: Parameters = [    “key”: “value”,    ...]// request with json encoded parametersAlamofire.request(“myphp.php”, method: .post, parameters: parameters, encoding: JSONEncoding.default).validate().responseJSON(completionHandler: { (response) in// do things with data (e.g. show blog post)// PHPheader('Content-Type: application/json');$decodedPost = json_decode(file_get_contents('php://input'), true);// what to do with input...?// PREPARED STATEMENTS: insert, select, etc.// what to do with output...?// echo response - json-encoded so that// json completion handler in swift can work with it echo json_encode($output, JSON_NUMERIC_CHECK);我已經向一位朋友征求了一些建議,他告訴我他總是做以下事情(xss_clean()也是他發給我的一個功能)——無論數據是輸入還是輸出:$key = xss_clean(mysqli_real_escape_string($db, trim(htmlspecialchars($data)))); // e.g. $data = decodedPost["key"]然而,不僅我的研究告訴我這可能沒有必要,而且他還告訴我這有其局限性,最明顯的是,當數據應該從服務器再次檢索并再次顯示給例如另一個用戶時——盡可能接近盡可能使用原始輸入。如您所見,我真的很困惑。我想盡我所能保護發送到服務器的用戶數據,所以這對我來說是一個非常重要的話題。我希望這個問題不會太寬泛,但許多其他問題,就像我說的那樣,至少部分是矛盾的或非常古老的,例如仍然使用簡單的mysql擴展并且沒有準備好的陳述。如果您需要更多信息,請隨時詢問。非常感謝參考官方文檔(以支持答案)。謝謝!
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

輸入清理是一個誤導性術語,表示您可以對所有數據揮動魔杖并將其設為“安全數據”。問題是當數據被不同的軟件解釋為編碼要求時,“安全”的定義會發生變化。同樣,“有效”數據的概念因上下文而異——您的數據很可能需要特殊字符('、、&、<)——請注意,SO 允許所有這些作為數據。

可以安全嵌入到 SQL 查詢中的輸出可能不安全地嵌入到 HTML 中?;蛩雇蛱??;?JSON?;蛲鈿っ??;?CSV。并且剝離(或徹底拒絕)值以便它們可以安全地嵌入所有這些上下文(以及許多其他上下文)中,限制性太強。

那么我們應該怎么做呢?確保數據永遠不會造成損害。實現這一點的最佳方法是首先避免解釋數據。參數化 SQL 查詢就是一個很好的例子;參數永遠不會被解釋為 SQL,它們只是作為數據放入數據庫中。

相同的數據可用于其他其他格式,例如 HTML。在這種情況下,數據應在嵌入時針對該特定語言進行編碼/轉義。因此,為了防止 XSS,數據在被放入輸出時應該是 HTML 轉義(或 javascript 或 URL 轉義)。不是在輸入時。這同樣適用于其他嵌入情況。

那么,我們應該直接將我們得到的任何東西傳遞給數據庫嗎?

不 - 您肯定可以檢查有關用戶輸入的內容,但這高度依賴于上下文。讓我們稱其為 - 驗證。確保這是在服務器上完成的。一些例子:

  • 如果一個字段應該是一個整數,你當然可以驗證這個字段以確保它包含一個整數(或者可能是 NULL)。

  • 您通??梢詸z查特定值是否是一組已知值中的一個(白名單驗證)

  • 您可以要求大多數字段具有最小和最大長度。

  • 您通常應該驗證任何字符串僅包含對其編碼的有效字符(例如,沒有無效的 UTF-8 序列)

如您所見,這些檢查非常依賴于上下文。所有這些都是為了幫助增加您最終獲得有意義數據的幾率。它們不應該是保護您的應用程序免受惡意輸入(SQL 注入、XSS、命令注入等)的唯一防御,因為這不是這樣做的地方。


查看完整回答
反對 回復 2022-01-08
  • 1 回答
  • 0 關注
  • 143 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號