如何保护 PHP/JQuery/Ajax 调用?

Posted

技术标签:

【中文标题】如何保护 PHP/JQuery/Ajax 调用?【英文标题】:How to secure PHP/JQuery/Ajax calls? 【发布时间】:2016-01-30 07:05:13 【问题描述】:

总的来说,我是 Ajax 和 php 的新手。到目前为止,我设法对我的 PHP 脚本进行了 Ajax 调用,该脚本从我的数据库中获取数据。但是,经过测试,我意识到,即使我没有登录,我仍然可以直接访问和运行 PHP 脚本,当这种情况发生时,它会填充我表中的所有数据,这是我不希望发生的.

基于此,我发现了一个重大的安全问题,任何人都可以访问和运行脚本并查看用户信息。

现在我不熟悉 PHP 中的安全性和东西,对它有点陌生。我的问题是如何使脚本无法直接访问,或者只有在管理员登录后才能访问?

我阅读了有关我可以检查会话的信息,我尝试过,但由于某种原因它不起作用。所以我会把我编码的内容放在下面。

这是获取数据的 PHP,getData.php:

<?php
    session_start(); 
    if(isset($_SESSION['id']) && isset($_SESSION['name']) && isset($_SESSION['admin']) && ($_SESSION['admin']==1))
        include_once('config.php');
        //Create PDO Object
        $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
        //Set Error Handling for PDO
        $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        //Query
        $sql = "SELECT users.name, users.email, users.admin, stores.admin, stores.name FROM users INNER JOIN stores ON users.id=stores.admin";
        //Prepare Statement
        $stmt = $con->prepare($sql);
        $stmt->execute();

        while ($row = $stmt->fetch())
            echo '<tr>';
            echo    '<td>'.$row[4].'</td>';
            echo    '<td>'.$row[0].'</td>';
            echo    '<td>'.$row[1].'</td>';
            echo    '<td>**********</td>';
            if($row[2] == 1)
                echo    '<td>Yes</td>';
            elseif ($row[2] == 0) 
                echo    '<td>No</td>';
            
            echo '</tr>';
        
        $con = null;
    
?>

这是调用获取数据的 ajax。它只是一个 sn-p,但它是一个更大的东西的一部分(准确地说是点击按钮),myAjax.js:

$.ajax(    //create an ajax request to getData.php
    type: "GET",
    url: "includes/getData.php",             
    dataType: "html",   //expect html to be returned                
    success: function(response)     
        $("#userInfo > tbody").html("<pre>"+response+"</pre>");
    ,
    error:function (xhr, ajaxOptions, thrownError)
        alert(thrownError);
    
);

最后,当用户登录时,我设置了以下会话:

$_SESSION['id']
$_SESSION['name']
$_SESSION['admin']

$_SESSION['admin'] == 1 表示用户是管理员。否则就是 不是。

非常感谢任何帮助。

编辑:

忘记包含我试图检查会话的内容。我更新了 PHP。

谢谢

【问题讨论】:

"现在我不熟悉 PHP 中的安全性和东西,对它有点陌生。我的问题是如何让脚本无法直接访问,或者只有在管理员登录时才能访问可以访问吗?” — 与任何其他 URL 相同的方式 - 验证用户,然后检查他们是否被授权。 “我读了一遍,我可以检查会话”——如果您使用基于会话的登录,那么这将起作用。 “我试过了,但由于某种原因没有用”——在你分享的代码中没有任何尝试的迹象。 所有处理 ajax 请求的 php 代码都可以封装在 if( $_SESSION['admin']==1 ) /* code */ 中,这可能是一个基本选项 @Quentin 我尝试将 PHP 放入 if(isset($_SESSION['id']) &amp;&amp; isset($_SESSION['name']) &amp;&amp; isset($_SESSION['admin']) &amp;&amp; ($_SESSION['admin']==1)) 中,当我这样做时,没有数据会显示。所以我不确定出了什么问题。 @nTuply — 所以做一些调试。您正在测试四种不同的东西,但都是一次完成,所以您还没有确定其中哪一种失败了。 【参考方案1】:

我通常这样做是为了检查用户是否登录以显示结果或输出

使用if(!empty($_SESSION['admin'] &amp;&amp; $_SESSION['admin']==1 &amp;&amp; !empty($_SESSION['name']) &amp;&amp; !empty($_SESSION['id']))

使用 !empty 还将检查变量是否已设置并且是否具有任何值!即使变量的值为“null”,使用 isset 也会显示 true。所以它将传递 if 条件参数并显示结果。

还有一件事:

当您注销时,您需要使用...取消设置会话变量

<?php
session_destroy();
session_unset();

这种技术一直对我有用...谢谢

【讨论】:

为空实际上比检查空值的 if 语句更好。我将我的代码更新为此。现在完美运行。谢谢 看看还有一点需要检查,共享主机中的所有版本可能不支持空功能,例如godaddy,hostgator或bluehost等......在使这个项目上线之前,只需检查PHP版本,如果它是 5.3 或更多....谢谢

以上是关于如何保护 PHP/JQuery/Ajax 调用?的主要内容,如果未能解决你的问题,请参考以下文章

php+jquery+ajax简单Ajax调用示例 (转)

php+jquery+ajax+json的一个最简单实例

如何使用 php jquery ajax 上传文件和插入数据

PHP、jQuery Ajax 和 json 跨域返回

从 PHP (jQuery/AJAX) 插入 MySQL

用PHP+jQuery+Ajax+Mysql发表心情赞功能