如何清理来自数据库的数据

问题描述 投票:0回答:2

这是我关于堆栈溢出的第一个问题,我花了很多时间来搜索类似的问题,但令人惊讶的是找不到。

所以我读到,任何数据都不应该被信任,无论是来自客户端还是来自数据库的数据。现在,虽然有很多示例展示了如何清理用户的数据(

$_POST
$_GET
),但我找不到一个展示如何清理数据库中的数据的示例。

现在也许它与来自用户/客户端的数据相同(我认为应该如此),但我没有找到它的例子。所以我问这个只是为了确定一下。

例如,如果查询结果如下:-

    $row=mysqli_fetch_assoc($result);

    $pw = $row['Password'];
    $id = $row['ID'];
    $user = $row['Username'];

那么变量

$pw
$id
$user
在程序中使用之前是否必须进行清理?如果是这样,那怎么办?

谢谢大家。

security
2个回答
0
投票

你的想法在这里又回到了前面。当您能够使用 php 清理输入时,可能已经太晚了。数据已经在php中了。您不清理输入。你:

验证输入并清理输出

通常数据库由应用程序层包装。因此,其中唯一的数据应该已被您的代码过滤和转义。你应该能够相信它。但即便如此,在关系数据库中,数据也是相当强类型的。因此,从数据层攻击 php 的空间很小。

但是您应该清理(转义或编码)任何输出。如何做到这一点取决于您发送数据的位置和方式,因此应该在数据离开 php 的地方完成,而不是进入 php 的地方。您使用的方法(mysqli_escape、HTMLentities、base64、urlencode......)应该适合数据的去向。事实上,更改数据副本的表示(并在使用后丢弃它)比原始数据更好。


0
投票

我在这里对您的设计做出一些假设,但我将假设您只是使用 PHP 处理 MVC 应用程序的模型方面。在这种情况下,PHP 最容易受到后端 SQL 注入攻击和前端 XSS(跨站点脚本)攻击。 (注意:这不仅仅是 PHP 问题,这是所有编程中的一个问题,不同的语言为不同的问题提供不同的解决方案。记住 - 你需要知道你出于什么原因正在清理什么。没有一种方法适合全部。

所以说真的,除非您正在对该模型将要清理的所有代码中通用的东西进行清理,否则您可能不想在这里进行清理。 XSS 现在对您来说比 sql 注入更令人担忧……出路已经来不及阻止注入攻击了。

为了让果汁流动而采取一些自由 - 从安全的角度来看,鉴于您的代码似乎围绕身份验证,我会更直接地关注您如何存储和处理您的凭证数据。有几件事绝对应该做:

在存储之前通过安全的单向哈希运行密码(例如 BCrypt)。

    在将这些哈希值存储到数据库之前对它们进行加盐(对每个用户使用不同的盐),以保护用户的数据免受彩虹表攻击等攻击。
  1. 所有通信均使用 TLS。
  2. 建立和维护安全会话(跟踪用户登录而不暴露发送的每个请求的密码数据等)。
© www.soinside.com 2019 - 2024. All rights reserved.