停止从不同的域发布数据PHP

ldfqzlk8  于 2023-02-11  发布在  PHP
关注(0)|答案(7)|浏览(89)

我是PHP的初学者。
我正在尝试做的是停止来自另一个网页的帖子数据。
我遇到的问题是,假设有人复制了我的表单并将其粘贴到他们的网站上,我希望能够阻止该帖子数据在我的电子邮件表单上运行脚本。
我怎么能这么做?如果我说得不够清楚就告诉我。
我的PHP联系人表单在一个页面上运行,带有条件语句。即,如果数据检查出,提交。

tkqqtvp1

tkqqtvp11#

  • "accepted answer"存在安全漏洞*。您应该使用更安全的方法。举个简单的例子:
    • 第1步:**禁用页面(.php)的框架,在顶部添加:
header('X-Frame-Options: Deny');
    • 第2步:(重要部分!):**为了避免XSS和第三方攻击,您应该创建一个可过期的验证。例如:
  • ASP.NET内置表单使用动态输入csrf(示例值:gtlkjh29f9ewduh024cfvefb
  • WordPress内置表单使用动态输入nonce(示例值: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>
  • (加密器代码为here)*

提交时,请检查:

if(!empty($_POST)){

   // If REFERRER is empty, or it's NOT YOUR HOST, then STOP it
   if( !isset($_SERVER['HTTP_REFERRER']) || parse_url($_SERVER['HTTP_REFERRER'])['host'] != $_SERVER['HTTP_HOST'] ){
       exit("Not allowed - Unknown host request! ");
   }

   // Now, check if valid
   if (   Cryptor::decrypt(  $_POST['temp_random'], $_SERVER['REMOTE_ADDR'] . $secret_key) < time() - 60* 15 ) {
       exit("Not allowed - invalid attempt! ");
   }

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

}
91zkwejq

91zkwejq2#

您正在尝试阻止CSRF - Cross-Site Request ForgeryJeff himself有一篇关于此问题的博客文章。
真正的XSRF防护需要三个部分:

  • 隐藏的输入字段,防止有人窃取表单并将其嵌入
  • 在生成的表单的epsilon内进行时间检查,否则某人可以生成一次有效表单并使用令牌(取决于实现/存储方式)
  • Cookie:这是为了防止恶意服务器假装它是客户端,并执行中间人攻击
0yg35tkg

0yg35tkg3#

$_SERVER ['HTTP_Referrer']很不错,但不可靠。你可以使用MD5的隐藏表单字段,然后在另一边检查它。

djmepvbi

djmepvbi4#

其形式为:

<?
$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
}
tsm1rwdh

tsm1rwdh5#

如果您正在寻找一种快速而又简单的方法,可以检查REFERER头。
如果你真的想确保表单是从你的站点获取的,你应该在每次表单加载时生成一个令牌,并将其附加到会话中。一个简单的方法是:

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

那么您的表单可以有一个隐藏输入:

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

并且您可以在决定是否处理表单数据时进行检查。

tnkciper

tnkciper6#

每个用户都注册,然后获得一个登录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.
vktxenjb

vktxenjb7#

得分最高的答案中有一处打字错误。它应该是$_SERVER [“HTTP_REFER '],而不是$_SERVER [”HTTP_REFERRER']。

相关问题