【问题标题】:PHP form name security vulnerability?PHP 表单名称安全漏洞?
【发布时间】:2014-01-28 12:18:46
【问题描述】:

我是一名初级 PHP 开发人员,目前正在与一个小团队一起开发一个项目。这是我第一次在团队中参与项目,所以我学到了很多东西并培养了团队合作技能。

我注意到我的开发人员同事做了一件具体的事情,我认为这可能会带来很大的安全风险。创建表单时,他们将为输入名称提供数据库中的列名。这意味着无论数据发布到哪里,他们都可以对通过 POST 数组的每个循环使用一个漂亮的方法。当然,它既漂亮又简单,但我是否希望用户看到列的名称?

我不确定它是否会带来安全风险(我首先想到的是 SQL 注入),但如果它确实存在,可以做什么?

我想你可以散列输入的名称吗?尽管如此,这并不完全是 100% 安全的。如果在表单页面中的名称是“apple64”、“banana99”、“chickens”,然后在 PHP 文件中它们被转换为相应的列名怎么办?

我的问题的重点是找到这个(可能的)安全漏洞的一般做法。

【问题讨论】:

  • 当您将密码插入数据库时​​,它将是base64_encoded或使用md5,因此您的密码将是安全的。检查它是否为空或html特殊字符或html实体这都是sql注入
  • 恕我直言,如果您记住不信任用户输入并验证输入,那么命名字段(如列)没有问题。此外,我认为这是一个很好的做法。这是团队中的新成员快速集成到代码中的好方法。想象一下,如果每个字段都提供了一个哈希名称,那么您需要自己翻译每个哈希值才能知道哪个是什么。
  • @DarkBee 当然,情况确实如此,但安全应该始终放在 IMO 首位。如果它不构成威胁,但我完全同意你的看法(我认为你的建议)
  • @AghaUmairAhmed MD5 和 base64 不安全...使用 >= 5.5.0 (php.net/manual/en/function.password-hash.php) 中提供的 password_hash 函数
  • 在代码中包含列的名称绝不是不安全的。如果你只是为了它而混淆它们,那将是经典的通过默默无闻的安全

标签: php security sql-injection


【解决方案1】:

这种一般做法称为“白名单”。

您对此漏洞的看法是完全正确的。对于初级开发人员来说,你的眼光非常好。事实上,大多数自称“专业人士”的人从不为这些问题烦恼。

因此,为了防止普通的 SQL 注入以及对表字段的随机访问(可能不允许用户访问其中的某些字段),您必须根据预先编写的白名单验证您的帖子数据。

这里以my approach for either classic mysql or PDO为例。

【讨论】:

    【解决方案2】:

    当您开发时,您必须向用户提供最少的信息。 标题/数据库名称/列名等。

    如果您的表单处理不安全,则存在 sql 注入的风险。 要控制您的 sql 请求,您必须准备它们并检查变量是否具有特殊字符。

    关于 pdo 的文档 http://php.net/manual/en/pdo.prepare.php

    关于 sql 注入的一个很好的“操作方法”: http://www.unixwiz.net/techtips/sql-injection.html

    【讨论】:

    • 我准备好了!这并不是我所问问题的真正答案(不是粗鲁)。我在问用户通过查看源代码并查看输入字段的名称属性值来了解列名是否构成威胁。准备它们等对我来说都是基本练习:)
    • 但是你不能用 PDO 参数化列名,Dimi。
    • @jskidd3 你如何“准备”列名?
    • @Gumbo 你不能准备它们。
    • @Stan 不,您不能使用 DBMS 准备好的语句来准备它们。但你可以逃脱它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2014-04-28
    • 1970-01-01
    相关资源
    最近更新 更多