【发布时间】:2019-02-04 11:25:43
【问题描述】:
我正在尝试对网络表单实施 CSRF 保护。它是一个捕获数据的单页网站,将其发布到 PHP 文件,然后通过电子邮件将信息发送给我。网页按预期运行(减去安全性)。
我遇到以下问题:
- 我不知道如何实现 PHP 代码来设置令牌;将 index.html 转换为 index.php 会加载一个空白正文。我认为解决这个问题可能会解决我的问题。
- 当我尝试从 jQuery 调用 token.php 时,出现 403 错误。
- 当我尝试在 1 像素 iframe 中运行脚本时,我收到 500 错误(我假设它是在 HTML 上运行的)。
token.php
<?php
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
?>
formsubmit.php
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) {
$emailbody = 'Name: ' . $_POST['m_title'] . ' ' . $_POST['m_firstname'] . ' ' . $_POST['m_surname'] . "\n"
. 'Email: ' . $_POST['m_email'] . "\n"
. 'Phone: ' . $_POST['m_phone'] . "\n"
. 'D.O.B: ' . $_POST['m_dob_day'] . ' ' . $_POST['m_dob_month'] . ' ' . $_POST['m_dob_year'] . "\n"
. 'Postcode: ' . $_POST['m_postcode'] . "\n"
. 'Lenders: ' . $_POST['m_bank1'] . ',' . $_POST['m_bank2'] . ',' . $_POST['m_bank3'] . ',' . $_POST['m_bank4'] . ',' . $_POST['m_bank5'] . ',' . $_POST['m_bank6'] . ',' . $_POST['m_bank7'] . ',' . $_POST['m_bank8'];
mail('**removed**', 'Web Lead', $emailbody);
header('Location: **removed**/thankyou');
exit();
}
else {
echo "token invalid";
}
}
else {
echo "token blank";
}
}
else {
echo "invalid request";
}
?>
我在 index.html 中的 jQuery 尝试
<script>
$(document).ready(function() {
$.get('token.php');
});
</script>
如果上面的 PHP 没有错误,我曾认为成功将其转换为 index.php 可以解决我的问题,但我很难这样做。
【问题讨论】:
-
可以分享整个index.html文件内容吗?
-
顺便说一句,你应该在token.php中回显token变量,否则该文件没有任何内容并且ajax响应没有内容。
-
“将 index.html 转换为 index.php 会加载正文空白”通常意味着 .php 解析失败(致命的不可恢复)。您的浏览器应该显示服务器 500 错误?检查服务器上的错误日志(如果您启用了日志记录)。
-
您遇到的问题是
$.get('token.php');在服务器返回数据后不会对数据执行任何操作。大概您想将该脚本的输出写回您的页面? -
@Alberto Boss 不允许我识别该网站,因此我无法在不删除大部分内容的情况下发布索引。我是否需要获取生成的令牌并将其设置为隐藏字段,以便我可以在 formsubmit.php 中进行比较?
标签: php html session token csrf-protection