我有一个sendmessage.php文件和其他发送电子邮件的类似文件。我想禁止直接访问这些文件,让它们可行,但我不知道为什么。
怎么做?
这是我使用它们的方式
$.ajax({
type: 'POST',
url: 'sendmessage-contact.php',
data: $("#contact").serialize(),
success: function(data) {
if(data == "true") {
$("#send").fadeOut("fast", function(){
$(this).before("<p><strong style='color:#D60096'></strong></p>");
setTimeout("$.fancybox.close()", 3000);
});
}
}
});
答案 0 :(得分:2)
deny form all
可能不符合你的要求,所以我提出另一个建议:
相反,您应该在页面加载时生成随机散列字符串并将其写入会话:
session_start();
//$_SERVER['HTTP_X_REQUESTED_WITH'] is pretty much pointless, just illustrating redundancy here, may not work for you so remove as desired
if(isset($_POST['hash_key']) && $_SERVER['HTTP_X_REQUESTED_WITH']):
if(isset($_SESSION['hash_key']) && $_POST['hash_key'] === $_SESSION['hash_key']):
//call your function to process this
return myFunction($_POST['contact']);
else:
//no session key, deny them
header('HTTP/1.0 403 Forbidden');
endif;
elseif(!isset($_POST['hash_key']) && !isset($_SERVER['HTTP_X_REQUESTED_WITH'])):
//not trying to post, not trying to send ajax, generate a new hash key
$_SESSION['hash_key'] = md5(uniqid(rand( ), true));
endif;
现在,在生成HTML的页面后面,您需要创建一个带有此值的隐藏输入。
<input type="hidden" id="hash_key" name="hash_key" value="<?php echo $_SESSION['hash_key'];?>"/>
现在您可以将此值传递给ajax函数中的服务器:
$.ajax({
type: 'POST',
url: 'sendmessage-contact.php',
data: {
'contact' : $("#contact").serialize(),
'hash_key' : $("#hash_key").val()
},
success: function(data){
console.log(data);
}
});
现在,如果机器人尝试向您的脚本发送垃圾邮件,那么它将无关紧要,因为它们会因为无法匹配我们创建的唯一生成的字符串而遇到403禁用错误我们的$_SESSION['hash_key']
。
<强>声明强>
请勿在任何情况下实际使用md5(uniqid(rand( ), true))
。为简洁起见,我只提供了这一点,并不是一种完全安全的方法。
修改强>
过分冗长。简化。