如何清理数据库中的数据

时间:2014-11-29 19:49:18

标签: security

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

所以我读到,无论是来自客户端还是来自数据库的数据,都不应该信任任何数据。现在虽然有很多示例显示如何从用户清理数据($ _POST或$ _GET),但我找不到一个显示如何清理数据库中数据的示例。

现在也许它与来自用户/客户端的数据相同(我认为它应该是这样),但我没有找到它的例子。所以我要求它确保。

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

    $row=mysqli_fetch_assoc($result);

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

那么变量$ pw,$ id和$ user必须在它们应该在程序中使用之前进行清理吗?如果是这样,那怎么样?

感谢所有人。

2 个答案:

答案 0 :(得分:0)

这取决于......您如何访问此数据库?谁工作/维护它?进入肯定是一个更大的问题。但是,如果您想要清理它来自数据库,您需要知道您正在清理什么。如果您想要针对XSS清理网页流量,您可能希望删除所有不在白名单上的网址,也可能是脚本标记和其他一些内容。您是否正在清理进入C / C ++程序的数​​据?那么您可能希望确保自己能够防止缓冲区溢出问题,因为这是一种合法的攻击途径。

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

所以,除非你在这个模型将要清理的所有代码中对一些普遍的东西进行消毒,否则你可能不想在这里消毒。对于你来说,XSS会比sql注入更加关注......出路已经来不及阻止注入攻击了。

为获取果汁而采取一些自由 - 从安全的角度来看,鉴于您的代码似乎围绕身份验证,我会更加关注您如何存储和处理您的凭据数据。一些事情肯定应该做:

  1. 在存储之前通过安全的单向哈希运行密码(例如BCrypt)。
  2. 将这些哈希值(对于每个用户使用不同的盐)进行盐化,然后将其存储在数据库中,以保护用户的数据免受彩虹表攻击等事件的影响。
  3. 使用TLS进行所有通信。
  4. 建立并维护安全会话(跟踪用户登录,而不会在发送的每个请求中公开密码数据)。

答案 1 :(得分:0)

你的想法在这里回到了前面。当你能够使用php消毒输入时,可能为时已晚。数据已经在php中。你不会对输入进行消毒。你:

验证输入&消毒输出

通常,数据库由应用程序层包装。因此,那里的唯一数据应该已被您的代码过滤和转义。你应该能够信任它。但即使这样,在关系数据库中,数据的输入也相当强。因此,从数据层攻击php几乎没有空间。

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