如何保护 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']) && isset($_SESSION['name']) && isset($_SESSION['admin']) && ($_SESSION['admin']==1))
中,当我这样做时,没有数据会显示。所以我不确定出了什么问题。
@nTuply — 所以做一些调试。您正在测试四种不同的东西,但都是一次完成,所以您还没有确定其中哪一种失败了。
【参考方案1】:
我通常这样做是为了检查用户是否登录以显示结果或输出
使用if(!empty($_SESSION['admin'] && $_SESSION['admin']==1 && !empty($_SESSION['name']) && !empty($_SESSION['id']))
使用 !empty 还将检查变量是否已设置并且是否具有任何值!即使变量的值为“null”,使用 isset 也会显示 true。所以它将传递 if 条件参数并显示结果。
还有一件事:
当您注销时,您需要使用...取消设置会话变量
<?php
session_destroy();
session_unset();
这种技术一直对我有用...谢谢
【讨论】:
为空实际上比检查空值的 if 语句更好。我将我的代码更新为此。现在完美运行。谢谢 看看还有一点需要检查,共享主机中的所有版本可能不支持空功能,例如godaddy,hostgator或bluehost等......在使这个项目上线之前,只需检查PHP版本,如果它是 5.3 或更多....谢谢以上是关于如何保护 PHP/JQuery/Ajax 调用?的主要内容,如果未能解决你的问题,请参考以下文章