我在尝试保护我的 indev 网站时遇到了障碍。该索引是一个 PHP 文件,它使用 Google Maps v3 API 来显示我所在城市的地图,用户可以在其中添加自己的标记。一旦他们添加了一个标记,他们就可以点击它来打开一个包含表单的信息框,该表单允许他们提交有关该位置的各种信息。表单,它只是一个用 JS 编写的 DOM 元素,POST 到 PHP 脚本,该脚本在参数化数据并将其插入 MySQL 数据库之前验证数据。该网站必然不需要注册,因此我尝试通过创建 PHP 脚本验证的一次性令牌来阻止表单泛滥,但未成功。
具体来说,我的问题是:我最初可以在 index.php 文件中创建令牌,然后在表单成功发布到 add.php 脚本后取消设置,但我无法从 JS 文件中执行任何 PHP 代码使用新标记更新隐藏的表单元素。
这是代码中发生的事情-
从 index.php(在页面加载时创建令牌):
$_SESSION['stoken'] = sha1(uniqid(mt_rand(), true));
现在创建了令牌,我将它分配给一个 JS 变量,如下所示:
var stoken = "<?php print($_SESSION['stoken']); ?>";
现在,我的外部 .JS 文件可以访问“令牌”,并在用户访问它时将其置于 Google 地图信息框窗口上的隐藏表单元素中。然后用户提交表单,我的 add.php 文件验证 $_SESSION['stoken'] 等同于 POSTed 隐藏表单值。然后它取消设置 $_SESSION['stoken']。
这就是我卡住的地方。我无法从 .JS 文件中运行任何 PHP 来设置或访问用户可能创建和填写的下一个 InfoBox 的新令牌。如果我允许用户对每个 InfoBox 使用相同的令牌,那么在桌面上创建一个 HTML 文件会非常简单,该文件会用条目淹没数据库。数据验证可以防止某人输入一堆随机的 BS,但个人仍然可以用稍微不同的值一遍又一遍地用“合法”信息填充数据库。
到目前为止,我提出了两个“解决方案”:
(1) 我可以强制重新加载页面,这会创建一个新令牌
或者
(2) 我可以设置 .htaccess 来指示 Apache 处理 JS 文件中的 PHP,允许我让新 InfoBox 的创建函数知道新令牌
在我看来,这两种选择都是只有像我这样的新手才会采取的应对措施,而且它们可能会导致其他问题。我感谢任何有关此问题的更优雅和合理的解决方案的帮助。谢谢。