繁体   English   中英

防止直接访问文件只能由Jquery Ajax访问

[英]Prevent a File for Direct Access should only access by Jquery Ajax

伙计们,我有一个问题。

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

CreateAdmin.php ----------> 填写表格

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

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

如何预防。

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

是否可以..如果可以,将影响访问速度。

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

1)在GET请求中(调用CreateAdmin.php), 开始一个会话 (如果尚未完成),并创建一个存储在会话中的随机字符串:

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

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

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

3)现在使用jQuery Ajax调用执行http POST请求 (不应是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文件的路径是不够的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM