【问题标题】:Server security for licensed application许可应用程序的服务器安全
【发布时间】:2011-05-04 06:59:34
【问题描述】:

警告:我对服务器安全几乎一无所知,所以不要假设:)

我们有一个用 PHP 编写的 webapp。它的某些功能取决于它与我们的服务器的联系和交互。

简单地说,应用程序使用 cURL 联系我们的服务器,并在我们的页面上发布大约 20 个不同的字段。这些字段的值来自文本输入和文本区域,主题中肯定会有 html 和一些 javascript,目前我们根本没有对它们进行数据清理、标签剥离等。我们只是获取该数据,对其进行一点解析,然后以稍微不同的格式重新显示给用户——基本上是将相同的数据以稍微修改的形式回显到他们的屏幕上。

唯一发生的数据库交互是其中一个字段是它们的许可证密钥。这将被输入到准备好的 MYSQL 语句中以验证用户。

我认为我们唯一的漏洞是许可证密钥是否正确,因为它是数据库交互的唯一点,并且我们应该已经准备好的语句涵盖了这一点?

我假设我们的服务器在接收用户数据、对其进行一点解析然后将其回显给他们时不应该存在安全风险,因为这不涉及数据库交互。如果这是一个错误的假设,请告知我为什么以及应该采取哪些步骤来更好地保护我们的系统。

【问题讨论】:

    标签: php mysql security curl


    【解决方案1】:

    最大的安全问题来自数据库交互(SQL 注入),因此您可能希望通过正则表达式将您的许可证列入白名单...

    if(preg_match('/^[a-z0-9]$/', $license)) {
       // Ok to proceed with database interaction...
    } else {
       die('NO USAGE FOR YOU!');
    }
    

    检查您没有在传入值中使用 eval() 或 ``(

    确保在使用之前定义所有变量。下面是一个不应该做的例子......

    if($_POST['password'] == $password) {
        $is_authenticated = true;
    }
    
    if($is_authenticated) {
        // ... code ...
    }
    

    您可能认为 ... 代码 ... 运行的唯一方法是让访问此脚本的人发布正确的密码。实际上,如果在服务器上启用了 register_globals,他们可以简单地将一个 get key=>value 像 .php?is_authenticated=1 传递给请求脚本。

    这是使用变量的正确(预定义变量)方式。

    $is_authenticated = false;
    if($_POST['password'] == $password) {
        $is_authenticated = true;
    }
    
    if($is_authenticated) {
        // ... code ...
    }
    

    您还需要调查 XSS 攻击的可能性,但这更多是基于您返回此数据的上下文。它是否也显示在您的网站上?是不是直接退给客户了?

    【讨论】:

    • 谢谢,很高兴知道这一点,尤其是关于 register_globals。不,数据只是直接返回给客户端。从不显示在我们的网站上。
    猜你喜欢
    • 2016-12-19
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2021-03-20
    • 2013-08-08
    相关资源
    最近更新 更多