我在PHP初学者。
我正在试图做的是停止发布数据从其他网页到来。
我遇到的问题是,假设有人复制了我的形式,并将其粘贴在他们的网站。 我希望能够停止执行后的数据从我的电子邮件的形式运行的脚本。
我怎样才能做到这一点? 让我知道如果我不是足够清晰。
我的PHP联系表格与条件语句在一个页面上运行。 也就是说,如果数据检出,提交。
我在PHP初学者。
我正在试图做的是停止发布数据从其他网页到来。
我遇到的问题是,假设有人复制了我的形式,并将其粘贴在他们的网站。 我希望能够停止执行后的数据从我的电子邮件的形式运行的脚本。
我怎样才能做到这一点? 让我知道如果我不是足够清晰。
我的PHP联系表格与条件语句在一个页面上运行。 也就是说,如果数据检出,提交。
$ _ SERVER [“HTTP_REFERRER”]将是很好的,但它是不可靠的。 你可以使用一个隐藏的表单字段,MD5的东西,然后你选择了它的另一面。
你试图阻止CSRF -跨站请求伪造 。 杰夫本人拥有这个博客新闻。
真正XSRF预防需要三个部分:
“接受的答案”有安全漏洞 。 相反,你应该使用更安全的方法。 一个简单的例子:
步骤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 ...
...........................................
}
形式:
<?
$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
}
如果你正在寻找一个快速和肮脏的方法,你可以检查Referer标头。
如果你真的想确保的形式从您的网站虽然牵强,你应该生成令牌每个窗体加载时间并将其连接到一个会话。 一个简单的方法来做到这一点会是这样的:
$_SESSION['formToken'] = sha1(microtime());
然后你的表单可以有一个隐藏的输入:
<input type="hidden" name="token" value='<?=$_SESSION['formToken'];?>' />
你可以检查决定是否处理您的表单数据时。
每个用户都注册和再获得一个登录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.