伙计们我有一个问题..
我已经创建了2个PHP文件..
CreateAdmin.php ----------> 有填写表格
Save.php ----------------> 通过jquery Ajax调用以插入数据库。
代码工作正常。但问题是我可以直接访问Save.php文件..当我访问每个访问时,在数据库管理表中创建一个空行。
如何防止它。
实际上我已经有了一个主意。当ajax调用会话变量时应该创建。 Save.php 的顶部应该有代码,如果没有会话变量页面应重定向..是否有可能..如果它可以,它会影响访问速度。
答案 0 :(得分:0)
我会在这里实现一些基本概念。我试着在这里尽可能简单地描述它们:
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文件的路径是不够的。