【问题标题】:Prevent a File for Direct Access should only access by Jquery Ajax防止文件直接访问只能通过 Jquery Ajax 访问
【发布时间】:2017-09-27 20:47:22
【问题描述】:

伙计们,我有一个问题..

我已经创建了 2 个 PHP 文件..

CreateAdmin.php ----------> 有一个表格要填写

Save.php ----------------> 通过 jquery Ajax 调用以插入数据库。

代码运行良好。但问题是我可以直接访问 Save.php 文件。当我访问每个访问时,数据库管理表中会创建一个空行。

如何预防。

其实我有个主意。当 ajax 调用一个会话变量时应该创建。 Save.php的顶部应该有代码如果没有会话变量页面应该重定向..

可以吗..如果可以的话会影响访问速度吗。

【问题讨论】:

  • Save.php 应该在添加之前检查数据。没有 get\pos​​t 变量没有添加到数据库,没有空行
  • 至少检查 $_SERVER['HTTP_X_REQUESTED_WITH'] 是 xmlhttprequest,设置并使用 CSRF 令牌到 X-TOKEN 标头中,并将代码更改为 POST 并检查 $_SERVER['REQUEST_METHOD']=='POST'

标签: php jquery ajax


【解决方案1】:

我将在这里实现一些基本概念。我尝试在这里尽可能简单地描述它们:

1) 在您的 GET 请求中(调用您的 CreateAdmin.php)start a session(如果尚未完成)并创建一个随机字符串以存储到您的会话中:

$_SESSION["token"] = sha256(uniqid(mt_rand(), true));

2) 将令牌作为隐藏字段添加到表单中

<input type="hidden" name="token" value="<?php echo $_SESSION["token"]; ?>">

3) 现在执行 http POST request with jQuery Ajax call(不应该是 GET 请求)。重要的是从表格中包含您的隐藏令牌。您还可以在您的 JS 中包含一个特殊值,表明这是来自 Ajax 调用,但这不会使您的 Save.php 更安全(见下文)。

4) 在 Save.php 中,首先检查调用是否为 POST 请求,如果不是则不继续。然后检查是否包含隐藏令牌并匹配会话中的值(您必须启动它),如果没有,请不要继续。

if (!isset($_POST['token']) || $_POST['token'] != $_SESSION['token']) die('invalid');

5) 如果两项检查均通过,您可以继续执行数据库操作,但首先我会对您的数据质量进行一些额外检查,这意味着输入的其余部分是否有效,例如: 如果需要,字段非空或字段值具有最小或最大长度或检查是否只允许包含字符等。

6) 在所有情况下,我都会从您的会话中删除令牌。 如果需要,为下一个请求生成一个新请求。

您可能还想限制令牌的有效期,或检查此会话中的用户是否有权执行此操作。

这不会有速度问题。有更多的事情可以考虑,但这应该是最低限度的。

例如,您要求该请求只能通过 Ajax 实现。老实说,我不会花太多精力来检查这一点。您可以尝试检查是否包含带有“XmlHttpRequest”的“HTTP_X_REQUESTED_WITH”,但这不会给您更多的安全性。您可以使用开发人员工具在任何现代 Bowser 中非常轻松地模拟 Ajax/POST 请求。但是使用所描述的方法,仅将 Save.php 文件的路径放在浏览器中是不够的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多