如何让我的PHP项目更安全?

时间:2013-05-18 08:36:13

标签: php javascript security css3 testing

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

该项目得到了我的大学的批准,并将在下周为5000名以上的学生提供服务,项目运作良好,但我担心学生可以进行黑客攻击。

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

我申请了以下证券:

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

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

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

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

我已经搜索并应用了上述证券,但想知道这类项目需要哪些其他东西,也许在.htaccess中有一些补充?

4 个答案:

答案 0 :(得分:3)

可以做一些小的改进:

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

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

3)为了安全地存储密码,请使用bcrypt这是一个很好的答案:Link

答案 1 :(得分:2)

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

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

我发现的其他一些问题:

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

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

答案 2 :(得分:2)

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

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

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

考虑一下您显示用户输入的方式,人们可能会使用<scripts>提交HTML代码,最好使用htmlspecialchars()

将其展平

答案 3 :(得分:1)

尝试使用此网址加密和解密的网址参数

$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是您要通过网址传递的参数

希望它对你有所帮助