0

我正在为我的大学开发一个项目。

该项目已获得我的大学的批准,并将在下周为超过 5000 名学生上线,该项目运行良好,但我担心学生可以执行的黑客攻击和入侵。

该项目是一个通知发布门户和技能提升项目,学院管理层将发布新闻,学生可以在电子邮件验证后查看。学生可以上传他们的成就与大学分享,可以分享他们的创意作品,如应用程序、网络服务等。他们还可以浏览其他学生的技能,这些学生的个人资料已填满,这将有助于组队。

我申请了以下证券:

  • if(isset($_SESSION['name']) && isset($_SESSION['email']) && isset($_SESSION['pass'])) 在每个页面上都使用过以防止未登录的用户。

  • mysql_real_escape_string($pass);// 用于转义特殊字符。

  • 密码使用 salt 方法 ( Crypt();) 加密。

  • 注册和文件上传限制期间的验证。

我已经搜索并应用了上述证券,但想知道在这类项目中还需要什么其他东西,也许在 .htaccess 中添加了一些内容?

4

4 回答 4

3

可以进行一些小的改进:

1)您只需要存储一个会话,在他们登录后您将在其中放置用户 ID。

2)不要再使用mysql了。使用 PDO,它是一个驱动程序,使您能够使用参数化查询来防止 sql 注入。

3)为了安全地存储密码,请使用 bcrypt 这里是如何使用它的一个很好的答案:链接

于 2013-05-18T09:04:54.810 回答
2

没有充分的理由在会话中存储密码(或散列密码,如果您正在这样做)。密码是秘密的。你应该非常小心处理别人的秘密。

存储唯一名称(或电子邮件)足以确定用户已登录。

我发现的其他一些问题:

  • 顶部登录表单中的密码字段不是“密码”类型。允许肩部冲浪。
  • mysql_real_escape_string()如果您对密码进行了哈希处理,则无需使用。散列密码应该是您收到密码后的第一件事。
  • 在帐户页面上,您为安全答案使用了“密码”类型字段,但您已使用该值预先填写该字段。这在 HTML 源代码中可用。你的是12345.
  • 你仍然display_errors在你的php.ini.
  • 没有 SSL。所有密码都将通过您的大学网络以未加密的方式发送。
  • 你的问题没有提到bcrypt,但它应该。BCrypt 是一种合适的密码散列算法。(PHP 称之为 CRYPT_BLOWFISH)。
  • 使用mysql_real_escape_string()表示您没有使用准备好的语句和绑定参数。这样做会使 SQL 注入变得不可能。切换到mysqli或 PDO。

我没有尝试向您的服务发出任何不寻常的 POST 请求,但我注意到您有一堆在 HTML 中禁用了编辑的字段。这实际上并不能阻止任何事情。我可以使用不同的学生证提交该表格。接收 PHP 是否处理这种情况?

于 2013-05-18T09:05:10.120 回答
2

搞砸的最简单方法是通过 SQL 注入(假设您正在使用数据库) - 甚至有机器人试图通过 SQL 注入将代码插入您的网页并传递恶意软件

只要有用户输入参数,我就会保护每个 SQL 语句(无论是 INSERT / SELECT / UPDATE / DELETE)。对于字符串,您已经很好地处理了它(但请阅读http://php.net/manual/en/function.mysql-real-escape-string.php以了解字符集警告),对于整数,我将使用 (int) 输入。

只要确保您经常备份数据库,那么您就可以面对任何有创造力的学生。

想想你显示用户输入的方式,人们可能会用 提交 HTML 代码<scripts>,最好用 htmlspecialchars() 将它们展平

于 2013-05-18T09:19:34.577 回答
1

试试这个对你的 url 参数进行加密和解密

$salt ='The key you can use anything';

加密:

function simple_encrypt($text)
{
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}

说明:

function simple_decrypt($text)
{
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $salt, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}

这里的 $text 是您要通过 URL 传递的参数

希望对你有帮助

于 2013-05-18T09:00:35.993 回答