繁体   English   中英

什么时候(以及何时)以及如何清理php中POST POST的数据(这样输出可用于Swift和HTML)

[英]When (and why the when) and how should I sanitize data from POST JSON in php (such that output usable in Swift AND HTML)

在过去的几天里,我通过PHP阅读了大量有关输入和输出数据清理的资源,以防止(最突出的)XSS和SQL注入,这是SO上的一堆问题。 然而,在这一点上,我觉得我更加困惑和不安全我应该做什么和我不应该做什么部分由于一些相反的信息,例如我多次读过我不知道如果我使用准备好的语句,需要使用mysqli_real_escape_string或任何其他形式的输入消毒,其他消息来源说我应该只是使用它,或者甚至我应该像这样消毒它 ; Apple的这个页面相当粗略(?)讨论了这个主题; 因此,我真的很感激对我应该做的事情的一些澄清 - 最好但不一定是由那些在该领域有经验的人(服务器端安全),例如在这个领域工作,做过一个很多研究或甚至可能在攻击者身边(?)。

为了更好地了解我的情况,我将尽可能简明扼要地介绍它:

我目前正在使用Swift(iOS)编写应用程序,并且需要将一些数据发送到我的服务器,使用SQL将其保存在表中,并且可以从其他用户(例如,博客)中检索。

为此,我通过POST(编码为JSON)将数据发送到我的服务器(“myphp.php”;使用Alamofire,这应该不是非常重要)并在那里解码。 这是第一个我不确定是否应该以某种方式清理我的数据的地方(参考我上面链接的问题)。 无论如何,然后我继续使用预处理语句将其插入表中(MySQL,因此没有任何模拟)。 此外,我还希望我输出的数据可以在html中使用,或者整个PHP也可用于AJAX。

这是我的意思的一个例子:

// SWIFT
// set parameters for request
let parameters: Parameters = [
    “key”: “value”,
    ...
]

// request with json encoded parameters
Alamofire.request(“myphp.php”, method: .post, parameters: parameters, encoding: JSONEncoding.default)
.validate().responseJSON(completionHandler: { (response) in
// do things with data (e.g. show blog post)

// PHP
header('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扩展和没有准备好的语句。 如果您需要更多信息,请随时提出。 非常感谢参考官方文件(以支持答案)。 谢谢!

输入清理是一个误导性的术语,表示您可以在所有数据上挥动魔杖并使其成为“安全数据”。 问题在于,当数据由不同的软件解释时,“安全”的定义会发生变化,编码要求也是如此。 类似地,“有效”数据的概念根据上下文而变化 - 您的数据可能非常需要特殊字符(',“,&,<) - 请注意,SO允许所有这些作为数据。

嵌入在SQL查询中可能安全的输出可能不适合嵌入HTML。 或斯威夫特。 或JSON。 或shell命令。 或者CSV。 剥离(或彻底拒绝)值,以便它们可以安全地嵌入所有这些上下文(以及许多其他上下文)中,限制性太强。

那我们该怎么办? 确保数据永远不会造成伤害。 实现这一目标的最佳方法是首先避免解释数据。 参数化SQL查询就是一个很好的例子。 这些参数永远不会被解释为SQL,它们只是作为数据放入数据库中。

相同的数据可以用于其他其他格式,例如HTML。 在这种情况下,数据应该在嵌入时对该特定语言进行编码/转义。 因此,为了防止XSS,数据应该在放入输出时进行HTML转义(或javascript或URL转义)。 不在输入时间。 这同样适用于其他嵌入情况。

那么,我们应该直接通过数据库传递任何东西吗?

不 - 你肯定可以查看有关用户输入的内容,但这是高度依赖于上下文的。 让我们称之为它 - 验证。 确保在服务器上完成此操作。 一些例子:

  • 如果一个字段应该是一个整数,你当然可以验证这个字段以确保它包含一个整数(或者可能是NULL)。
  • 您通常可以检查特定值是否为一组已知值之一(白名单验证)
  • 您可以要求大多数字段具有最小和最大长度。
  • 您通常应验证任何字符串是否仅包含其编码的有效字符(例如,没有无效的UTF-8序列)

如您所见,这些检查非常依赖于上下文。 而且所有这些都有助于增加你最终获得有意义数据的几率。 它们不应该是保护您的应用程序免受恶意输入(SQL注入,XSS,命令注入等)的唯一防御,因为这不是那样做的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM