PHP中的安全问题和架构

时间:2013-01-04 14:18:57

标签: php security

我的小程序基于PHP,MySql,Jquery和Ajax,提供来自数据库的登录和显示数据。 Login.html - > check-login.php - > success-login.php< - >显示-data.php

我的问题:

  1. 我应该担心或改善的任何安全概念。
  2. 关于$_SESSION,有人可能会在远程计算机上的php文件中添加$_SESSION['mytime']并伪装成授权用户吗?
  3. 我在Youtube上看到一个视频声称可以破解80%的登录(通过代理和密码字典),我应该设置用户可以登录的最长时间来阻止它或其他建议吗?
  4. 我可以在MySQL和php(服务器端)或javascript(客户端)上格式化数据,我是否总是在客户端进行,或者例如,如果有10个函数,8个在客户端,2个在服务器端等等。
  5. 我的代码如下:

    login.html(call check-login.php)

    check-login.php

    // connect database by PDO
    // if username and password (in md5) are matched
    session_start();
    $_SESSION['mytime'] = time();
    header('location:success-login.php');
    

    成功-的login.php

    session_start();
    if(!isset($_SESSION['mytime'])) {
      header('location:login.html');
       exit;
    }
    //use Jquery and Ajax to fetch data from database in show-data.php
    

    显示-data.php

    session_start();
    if(!isset($_SESSION['mytime'])) {
      header('location:login.html');
       exit;
    }
    //PDO database operation and return data in JSON
    

2 个答案:

答案 0 :(得分:0)

  1. 有许多安全问题,例如:Five common Web application vulnerabilities
  2. 不,用户不可能自己设置/更改$_SESSION变量。
  3. 您可以阻止用户选择一个简单的密码,或者您可以输入captcha,例如五次错误密码输入后。 (雅虎做到了)等......
  4. 我没有得到你正在寻找的东西。

答案 1 :(得分:0)

在开发此类应用程序时,您应该考虑很多事情。根据您从数据库显示的数据的敏感性,您可能希望开始使用HTTPS连接而不是纯HTTP。这就是我通常会采取的措施来提高安全性:

  • 创建加密会话 - 使用mcrypt并存储通过cookie在客户端解密会话所需的密钥。这样,即使有人最终可以访问服务器上存储会话的路径,他也无法解码会话,因为密钥存储在客户端。
  • 不要在URL中使用任何SQL,并且始终检查提交的数据是否有效 - 即,如果记录ID存在,输入的数据是否有效等等。
  • 注意跨站点脚本
  • 始终使用密码加密,如果您有敏感数据,请尝试加密。

关于您的其他问题:

  1. 我不确定你的问题是什么。 $_SESSION存储在服务器端。它只能由在该服务器上运行的脚本或手动更改(如果您手动编辑$_SESSION文件)
  2. 当用户无法登录X次时,请使用验证码(reCaptcha)。如果您愿意,可以添加锁定 - 如果用户未能登录5次,则用户将被锁定,并且带有解锁说明的电子邮件将被发送到用户的电子邮件地址。
  3. 我不知道format究竟是什么意思(是解析还是造型)。如果我响应AJAX请求,我会格式化数据并输出需要显示的数据。例如,如果我显示有关用户的信息,我会输出他的usernamefirst_namelast_nameemail,但不会输出他的password,{ {1}},password_salt以及任何其他敏感数据。
  4. 作为第3点的后续内容 - 当您从服务器端格式化数据时,由您决定如何显示它。您可以通过JavaScript执行此操作,也可以直接将其作为对AJAX请求的响应输出。这取决于你。
  5. 您提供给我们的代码是我不会使用的代码,因为它不会检查有效用户。如果用户具有bank_account变量的会话,则假定用户有效。我会在会话中存储mytimeuser_id(加密),然后检查这些值是否在数据库中匹配。这样,如果用户被删除或更改了他的密码,他的所有其他会话将变为无效。