1

我在尝试保护我的 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 的创建函数知道新令牌

在我看来,这两种选择都是只有像我这样的新手才会采取的应对措施,而且它们可能会导致其他问题。我感谢任何有关此问题的更优雅和合理的解决方案的帮助。谢谢。

4

1 回答 1

0

由于您使用 AJAX 请求来创建 Stoken(如果我的文本正确),您可以只返回以下值:

$_SESSION['stoken'] = sha1(uniqid(mt_rand(), true));

并写成 JS Var。这样做,您还可以激活正确的 Stoken,为您提供如何操作的提示,带有 Javascript 代码的 JS Fiddle 将是完美的。

根据您的 $.load() 或 $.ajax() 请求,使用 jQuery 执行此操作的示例是:

$.ajax({
  url: "XYZ"
}).done(function ( data ) {
  stoken=data;
});

您可以在那里找到更多信息:http: //api.jquery.com/jQuery.ajax/

于 2013-08-09T14:51:40.587 回答