Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据来自于精确的形式_Php_Jquery_Ajax_Forms - Fatal编程技术网

Php 数据来自于精确的形式

Php 数据来自于精确的形式,php,jquery,ajax,forms,Php,Jquery,Ajax,Forms,我一直在谷歌上搜索,但我仍然没有答案,所以我决定在这里问这个问题: PHP中有没有一种方法可以检查我在某些脚本中接收到的数据是否来自页面上的特定表单?我这样问是因为每个人都可以看到我用于将数据保存到数据库中的脚本的名称,因此如果有人能够找到整个URL,他也能够向脚本发送一些虚假数据,我需要一个条件,即只有当数据来自我页面上的正确表单时,才会触发保存过程 我使用jQuery调用AJAX函数,因此基本上如果我单击按钮“发送”,就会触发$.POST()方法来调用脚本以保存数据 谢谢, Tomas这是一

我一直在谷歌上搜索,但我仍然没有答案,所以我决定在这里问这个问题: PHP中有没有一种方法可以检查我在某些脚本中接收到的数据是否来自页面上的特定表单?我这样问是因为每个人都可以看到我用于将数据保存到数据库中的脚本的名称,因此如果有人能够找到整个URL,他也能够向脚本发送一些虚假数据,我需要一个条件,即只有当数据来自我页面上的正确表单时,才会触发保存过程

我使用jQuery调用AJAX函数,因此基本上如果我单击按钮“发送”,就会触发$.POST()方法来调用脚本以保存数据

谢谢,
Tomas

这是一个有趣的话题,但你忽略了一个要点:垃圾机器人/坏用户也可以通过使用特定的表单页来轰炸你的数据库(!)

因此,问题不在于如何检查请求是否来自该页面,而在于如何检查他是普通用户还是机器人/垃圾邮件发送者/机器人

用验证码,比如


如果我稍微误解了这个问题:如果你想确保请求来自“真实”用户,你必须使用登录系统/用户系统并检查用户id/密码(通过db或会话)每次您想要执行db请求时。

您可以通过检查以下内容来验证是否通过AJAX请求页面:

strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest'
你也可以检查一下


但听起来好像你在试图保护一个处理易受攻击数据的页面。这不仅仅需要上述两件事。我建议您通过谷歌搜索“CSRF伪造”来获取更多信息。

这些都是您应该关注的内容

  • 卡普希卡斯
  • 参考检查
  • 使用POST而不是GET。[仍然可以实现自动化。]
  • 使用令牌检查请求是否有效 提交数据时,您始终可以添加某种安全令牌:

    令牌可以很容易地扩展到许多不同的用途,并在检查某些请求是否有效时覆盖广泛的领域,例如,您可以让您的非关键表单公开,要求用户从某个页面获取他们的密钥(强制他们打开该页面),然后在提交数据时使用这些密钥来识别他们

    当然,所有这些对用户来说都是完全透明的,因为您可以通过cookies(或会话cookies,在这里并不重要,因为服务器密钥在使用后会发生变化,并在指定的时间内或当用户的身份发生变化时失效),从首页提供密钥,只有打开首页的用户才能向服务器提交数据

    另一种情况是,在同一个页面中提供cookie,该页面包含向服务器提交数据的表单。每个打开页面的用户都有自己的密钥可以立即提交数据,但如果有人试图从外部发出请求,则会失败。

    只使用AJAX? 这是我对另一个问题的回答,这个回答涵盖了向ajax请求插入额外数据的不同方法:(仔细看一下

    目前,我以这种方式使用代币: 用于提交的表格 这个隐藏的输入可以添加到表单中,这不是必需的,因为您可以使用前面描述的方法。

    处理提交的表单数据
    if(!isset($_SESSION['FORM_ID'])|$_SESSION['FORM_ID']!=$_POST['formid'])){
    //如果要将用户重定向回表单并保留值,则可以使用这些选项:
    //$\u会话['RELOAD\u POST']=$\u POST;
    //$\u会话['RELOAD\u ID']=uniqid('re');
    echo“表单已过期,无法提交值”;
    //回声';
    
    退出(1);//恶意用户总是可以使用Firebug或Fiddler修改受信任的表单或请求数据本身。您在这里担心什么?@DCoder如果使用令牌,恶意用户仍然需要从服务器获取安全令牌。如果需要某种登录过程来获取令牌(即使是透明的公共无密码会话登录)然后,你描述的邪恶无法使用Firebug或类似的东西,除非先经过登录过程。当然,操纵发送的请求仍然是可能的。我不是chaptcha的忠实粉丝,因为我认为这对用户来说很烦人。顺便说一句。正如你在我的问题中所看到的,我正在使用POST。无论如何,谢谢你的回答:)谢谢你的回答。我使用了很多正则表达式,我最喜欢的技巧是每次有任何更改时都检查字段中的值。如果它与此字段的preg_匹配,我只会将值返回到字段中,如果有问题,我总是返回原始值,而不带坏字符rs在里面。我认为由于没有办法通过表单发送一些令人讨厌的东西。你觉得怎么样?顺便说一句。我不是一个真正的验证码粉丝,因为我只是觉得这对用户来说很烦人。谢谢你的回答。听起来不错。我试图获取发送请求的页面的名称,但它没有正常工作,所以我放弃了。我会像你说的那样用谷歌搜索“CSRF伪造”,因为你不是第一个推荐我的人。谢谢你。谢谢你的回答。我喜欢你的令牌技术,这可能是我将要使用的:-)
    $.ajax({ 
        ... 
        data: /* here */ 
        ...
    
    <input type="hidden" name="formid" value="<?php echo generateFormId(); ?>" />
    
    function generateFormId() {
        // Insert some random string: base64_encode is not really needed here
        $_SESSION['FORM_ID'] = 'FormID'.base64_encode( uniqid() );
        // If you want longer random string mixed with some other method just add them:
        //$_SESSION['FORM_ID'] = 'FormID'.base64_encode( crypt(uniqid()).uniqid('',true) );
        return $_SESSION['FORM_ID'];
    }