后停止数据从不同的域PHP(Stop Post Data From Different Domain

2019-06-24 15:53发布

我在PHP初学者。

我正在试图做的是停止发布数据从其他网页到来。

我遇到的问题是,假设有人复制了我的形式,并将其粘贴在他们的网站。 我希望能够停止执行后的数据从我的电子邮件的形式运行的脚本。

我怎样才能做到这一点? 让我知道如果我不是足够清晰。

我的PHP联系表格与条件语句在一个页面上运行。 也就是说,如果数据检出,提交。

Answer 1:

$ _ SERVER [“HTTP_REFERRER”]将是很好的,但它是不可靠的。 你可以使用一个隐藏的表单字段,MD5的东西,然后你选择了它的另一面。



Answer 2:

你试图阻止CSRF -跨站请求伪造 。 杰夫本人拥有这个博客新闻。

真正XSRF预防需要三个部分:

  • 隐藏输入字段,以防止有人抢只是形式和嵌入它
  • 形式的埃普西隆内Timechecking产生,否则有人可以一次生成有效的形式和使用令牌(取决于impementation /它是如何存储)
  • 饼干:这是为了防止恶意服务器从假装这是一个客户端,并且进行中间人攻击


Answer 3:

“接受的答案”有安全漏洞 。 相反,你应该使用更安全的方法。 一个简单的例子:

步骤1:首先,禁用页面(的成帧.php ),其中产生的形式.php 。 在顶部加入:

header('X-Frame-Options: Deny');

步骤2:(!重要组成部分):为了避免XSS和第三方攻击,你应该创建一个验证临时密钥。 例如:

  • ASP.NET内置形式使用动态输入CRSF(例如值: gtlkjh29f9ewduh024cfvefb
  • WordPress内置形式使用动态输入的随机数 (例如值: 340297658942346
  • 您的设置形式? 没有? 那么它的脆弱。

所以,如果你是一个自定义的平台,不具有内置的临时令牌验证方法,然后创建你的,像这样简单的概念:

<?php  
$secret_key      = 'fjd3vkuw#KURefg';  //change this
$encrypted_value = Cryptor::encrypt( time(), $_SERVER['REMOTE_ADDR'] . $secret_key);
?>
<form>
...
...
<input value="<?php echo $encrypted_value;?>" name="temp_random" type="hidden"  />
</form>

(Cryptor代码是在这里 )

在提交,请检查:

if(!empty($_POST)){

   // ================ STEP 1 (Basic validation) ======== //
   // if REFERRER is empty, or it's NOT YOUR HOST, then STOP
   if( !isset($_SERVER['HTTP_REFERRER']) || parse_url($_SERVER['HTTP_REFERRER'])['host'] != $_SERVER['HTTP_HOST'] ){
       exit("You are not allowed 1 !");
   }

   // ================ STEP 2 (Stronger validation) ======== //
   if (   Cryptor::decrypt(  $_POST['temp_random'], $_SERVER['REMOTE_ADDR'] . $secret_key) < time() - 60* 15 ) {
       exit("You are not allowed 2 !");
   }




   ...........................................
   ... Now, you can execute your code here ...
   ...........................................

}


Answer 4:

形式:

<?
$password = "mypass"; //change to something only you know
$hash = md5($password . $_SERVER['REMOTE_ADDR']);
echo "<input type=\"hidden\" name=\"iphash\" value=\"$hash\"/>";
?>

当你正在检查:

$password = "mypass"; //same as above
if ($_POST['iphash'] == md5($password . $_SERVER['REMOTE_ADDR'])) {
    //fine
}
else {
    //error
}


Answer 5:

如果你正在寻找一个快速和肮脏的方法,你可以检查Referer标头。

如果你真的想确保的形式从您的网站虽然牵强,你应该生成令牌每个窗体加载时间并将其连接到一个会话。 一个简单的方法来做到这一点会是这样的:

$_SESSION['formToken'] = sha1(microtime());

然后你的表单可以有一个隐藏的输入:

<input type="hidden" name="token" value='<?=$_SESSION['formToken'];?>' />

你可以检查决定是否处理您的表单数据时。



Answer 6:

每个用户都注册和再获得一个登录ID。

以下是算法,以防止CSRF: -

1) $login_id = user login id (converted to a numeric id using mysql)
2) $a_secret_key = $_SERVER['UNIQUE_ID'];
3) $remote_addr = $_SERVER['REMOTE_ADDR'];
4) Request Date and Time -> A unique reference key -> $refkey
5) $_SESSION['secretkey'] = $_SERVER['UNIQUE_ID'];

结合上述1至4创建一个JSON文件,将数据传送到另一个页面。

然后

echo "<input type=\"hidden\" name=\"refkey\" value=\"$refkey\"/>";

在接收机端: -

接收器页面应该检查一下

1) any json file with $refkey exists at server?

2) If $refkey exists, then check $login_id, $a_secret_key and $remote_addr exists and are correct.


文章来源: Stop Post Data From Different Domain PHP
标签: php forms post