我正在尝试使用AJAX来确定一种保护Web服务调用的方法。 Web服务处理联系表单并调用PHP,该PHP使用mail函数发送没有HTTP请求的电子邮件。
我已在下面发布了一些代码,以便您更好地了解我的要求。我试图通过HTTP请求阻止对服务的直接调用,导致我的邮件服务器在每次请求页面时都能正常工作。
// Data is compiled into datastr...
var datastr =
'input_name=' + encodeURI(input_name) +
'&input_email=' + encodeURI(input_email) +
'&input_organization=' + encodeURI(input_organization) +
'&input_title=' + encodeURI(input_title) +
'&input_phone=' + encodeURI(input_phone) +
'&input_comments=' + encodeURI(input_comments);
// AJAX is called with datastr param...
$.ajax({
type: "POST",
url: "../common/contact-form-logic.php",
data: datastr,
cache: false,
success: function(resp) {.... etc
这是PHP文件服务。
$input_name = urldecode($_REQUEST['input_name']);
$input_email = urldecode($_REQUEST['input_email']);
$input_organization = urldecode($_REQUEST['input_organization']);
$input_title = urldecode($_REQUEST['input_title']);
$input_phone = urldecode($_REQUEST['input_phone']);
$input_comments = urldecode($_REQUEST['input_comments']);
$to = "xxxxxxxxxxxxxxxxx";
$subject = "Contact form entry from xxxxxxxxxx.com";
$message = $input_name."\n".$input_email."\n".$input_organization."\n".$input_title."\n".$input_phone."\n".$input_comments;
if(mail($to, $subject,$message)){
echo "1";
}
答案 0 :(得分:2)
我正在教自己安全,并发现自己处于类似情况,这就是我所做的:
* 免责声明我不是安全专家,但我觉得这比没事要好......
然后我检查了我生成部分会话的令牌(下面的例子)
session_start();
$token = md5(uniqid(rand(), TRUE));
$_SESSION['token'] = $token;
if (isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'])
{
/* Valid Token */
}
我针对白名单检查了$ _POST键,以确保我拥有所需的一切
这是一个例子
// No post no dice!
if( empty($_POST) )
die('error no post');
// Check for xmlhttprequest header
// I want to make sure this post came from an ajax call.
if( empty($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')
die('error invalid ajax request');
// Check to make sure the ajax request came from yourdomainhere.com
if( strpos($_SERVER['HTTP_REFERER'], 'yourdomainhere') === FALSE )
die('error invalid http ref');
// DIE, if no token is present or token isn't equal to $_SESSION token.
if (!isset($_POST['token']) || $_POST['token'] != $_SESSION['token'])
die('error invalid token');
// Check to make sure all POST array keys I need exist for my script
$vars_needed = array("input_name", "input_email", "input_organization", "input_title", "input_phone", "input_comments");
foreach($vars_needed as $need) {
if(!array_key_exists($need, $_POST))
die('error invalid post');
}
答案 1 :(得分:0)
你想要保护什么?消息的内容或访问邮件功能?
对于前者,您需要使用HTTPS。