【问题标题】:General Security Questions about MySQL and PHP, Forms关于 MySQL 和 PHP、表单的一般安全问题
【发布时间】:2018-10-21 22:07:15
【问题描述】:

我正在尝试开发一个 Web 应用程序,用户可以在该应用程序中输入数据并在我的站点内的各种子应用程序中以格式化的方式检索它。基本上,这是一个形式繁重的应用程序。我使用 PHP、HTML 和 MySQL 来开发它。我希望有一天我能把它商业化。我足以使网站正常运行,但随着我对它的更多开发,我想更多地考虑安全性。我还有一个管理仪表板,我可以在其中控制和管理主应用程序。

所以有两个应用程序,2个MYSQL数据库和数据库和表之间的信息共享。编程语言一点都不高级(大概菜鸟级别)

  1. 对于表单,在我将输入的数据发送到mysql进行存储之前,我使用以下;

    $lname = stripslashes($_REQUEST['lname']);
    $lname = mysqli_real_escape_string($concfc, $lname);
    

    在我开发更多的表单之前,我是否应该实现一些其他的东西来增加?我一般可以采用哪些其他方法来提高安全性?

  2. 我使用 $_GET 变量,通过 URL 传递变量,like my question here.. 有很多关于清理它的讨论。我真的不知道这意味着什么,除了我为上面的表格做的事情。

  3. 最终,应用程序将在应用程序中托管(很可能会使用第三方提供商托管)用户上传的文件以供使用(通过电子邮件发送、保持文件的顺序等)。

  4. 我还可以开始做些什么来使我的应用程序更安全吗?我希望我的问题不会像我试图学习“最佳实践”那样模糊,至少就我的编程知识水平而言。我知道网上有很多信息,但我真的不确定哪一个更合适、必要或适用。

谢谢

【问题讨论】:

  • PHP the Right Way 的必填链接应该可以回答您的许多问题。
  • 请注意,stripslashes 是 PHP API 中遗留的垃圾,这是由于多年前从 PHP 中清除的考虑不周的“魔术引号”功能的结果。这些天它绝对没有用,所以它不应该出现在你的代码中。它只会破坏数据。
  • 如果您刚刚开始使用 PHP 并想构建应用程序,我还强烈建议您查看各种 development frameworks,看看是否能找到适合您的风格和需求的。它们有多种风格,从 Fat-Free Framework 之类的轻量级到 Laravel 之类的更全面。这些为您提供了具体的示例,并为您提供了有关如何编写代码和组织文件的更有力的指导。
  • 嗨@tadman。非常感谢 PHP the Right Way 链接。这让事情变得更容易。我之前探索过 Laravel 之类的选项,但真的无法理解编码以构建更多。我想在进入 Laravel 这样的环境之前,我会增强我对编程的整体理解。

标签: php mysql forms security


【解决方案1】:

用我 10 多年的 PHP 和安全编程知识回答您的问题:

1) 您的过滤器是基本的,但可以有效避免 SQL 注入,因为您使用了mysqli_real_escape_string()。您需要记住,您永远不能相信收到的数据。在我的系统中,我总是在代码顶部清理我需要处理的所有数据,例如:

<?php
$data = array ();
$data["name"] = trim ( ucfirst ( strtolower ( $_REQUEST["name"])));
if ( empty ( $data["name"]))
{
  die ( "User name is required.");
}
$data["age"] = (int) $_REQUEST["age"];
if ( $data["age"] == 0)
{
  die ( "User age is required.");
}
// and so on. If I receive an email, I validate it too. BTW, I always validate if a received value are completely valid, into a valid range, valid structure, etc.

在清理之后,在我使用来自$data[] 的代码处,这是接收到的过滤和有效值。

在 SQL 查询中,我使用 mysqli_real_escape_string()。您也可以使用准备好的语句。

2) 当您使用 GET 方法时,您的变量在 URI 上一目了然。你也有大小的限制。

限制因使用的服务器和客户端而异(如果适用,服务器或客户端使用的代理也是如此)。

I.E.例如限制为 2048 字节 (2KB),Opera 限制为 4096 字节 (4KB),Firefox 限制为 8192 字节 (8KB),大多数现代 Web 服务器限制为 8192 字节 (8KB)。

如果可能,最好使用POST

在 PHP 中,您可以通过 $_REQUEST 访问数据,混合使用 $_GET$_POST

3) 请记住将其存储在磁盘上。创建数据库是为了存储数据,而不是文档。这是一个常见的错误。

4) 继续阅读并寻找最佳实践。使用安全哈希存储您的用户密码(我推荐hash_pbkdf2()),使用 SSL,记录在系统上执行的每个操作以在必要时进行审核,保持所有系统备份最新,控制谁可以访问您的服务器,使用防火墙,检查用于登录尝试等。

希望这对您有所帮助,我知道这远非一个好的措施汇编,但这是一个好的开始。

【讨论】:

  • 不要使用 PBKDF,使用默认为 Bcrypt 的password_hash,这是一种与 SHA2 相比非常强大的特定于密码的哈希方法。不要使用手动转义,始终尽可能使用带有占位符值的预准备语句。
  • @tadman PBKDF2 你可以使用SHA256、salt 和迭代(我使用 40000)。这是远优于任何其他哈希方法的最佳方法。它是密码哈希的最新安全标准。读一读吧。
  • SHA2-256 已经因为比特币而被优化到荒谬的水平,所以即使是 40,000 轮也不是那么具有挑战性。 Bcrypt 还被设计为抗 GPU,而 SHA2-256 是 GPU 的理想选择。请参阅citations like this,其中 PBKDF2 获得了非常差的评价。你想要一些抗 GPU 的东西,因为像 Hashcat 这样的工具有广泛的,有点可怕的 GPU 选项。
猜你喜欢
  • 1970-01-01
  • 2011-08-26
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多