我想防止人们在我的php文件上使用cURL, 不仅是cURL,而且每个POST请求都不是来自我的网站
我想办法做到这一点,请告诉我这个过程是否错误><。
我有一个简单的 POST 表单,它根据 $_POST 详细信息执行操作:
form.php:
<?PHP
session_start();
session_regenerate_id();
if( isset($_POST['username']) && isset($_SESSION['pass']) )
{
// start mysqli query to check the details
}
?>
这样,客户端可以使用 cURL 并向 form.php,
发送大量 POST 请求,if 语句将始终返回 true.
现在,我想到这样:
当客户端在我的域中时,我将创建一个唯一的令牌并将其保存在会话中,
例如:$_SESSION['UID'] = getRandomToken((;
此代码只能在名为createUID.php:
的单独文件上运行
<?PHP
session_start();
session_regenerate_id();
$_SESSION['UID'] = getRandomToken();
?>
此代码在我的网站中的每个请求上运行.
现在,这是更新的表单.php:
<?PHP
session_start();
session_regenerate_id();
if( ! isset($_SESSION['UID']) )
{
die('You are trying to use cURL.');
}
if( isset($_POST['username']) && isset($_SESSION['pass']) )
{
// start mysqli query to check the details
}
?>
这样,当客户端尝试在form.php上使用cURL时,他将需要$_SESSION['UID'] 设置以继续代码。 当用户通过 cURL 向表单发送请求.php时,永远不会设置 $_SESSION['UID'], 因此,代码将死亡。
为了知道该技术是否安全,我有一个问题: 无论如何,客户端会向createUID发送请求.php设置$_SESSION['UID'], 然后向表单发送请求.php并带有已经设置的 $_SESSION['UID'] ?(不仅使用 cURL(
我使用 2 个 cURL 请求进行了测试:
test.php:
<?php
session_start();
session_regenerate_id();
$url = "http://localhost/createUID.php";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$url = "http://localhost/form.php";
$data = array('username' => 'admin', 'pass' => '123456');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
?>
createUID.php:
<?php
session_start();
session_regenerate_id();
$_SESSION['UID'] = '456a4sd56a4s65d4as'; //example of a random token
echo 'session of createUID.php: ';
print_r( $_SESSION ); //will print 456a4sd56a4s65d4as
echo '<br /><br />';
?>
形式.php:
<?php
session_start();
session_regenerate_id();
echo 'session of form.php: ';
print_r( $_SESSION ); //will print nothing
echo '<br /><br />';
if ( ! isset($_SESSION['UID']) )
{
die('Not allowed');
}
?>
结果是 ( ! isset($_SESSION['UID']( 将始终返回 true.
你怎么看?
谢谢!
你问
无论如何,客户端是否会向createUID发送请求.php以设置一个 $_SESSION['UID'],然后向表单发送请求.php并带有 $_SESSION['UID'] 已经设置了?
答案是:是的。
这根本不难。
在您的表单中使用 CSRF 令牌将是阻止此类事情的好方法。或者您可以使用验证码来完成类似的工作。
CSRF并非完全不可战胜,但它使攻击者更加困难。验证码对于非人类/非浏览器客户端来说应该是无与伦比的,但它也有一个缺点,即它通常也会对真实用户造成干扰。
P.S. 您的两个请求 cURL 测试似乎有效的原因是它可能创建了两个单独的会话。浏览器将会话 Cookie(由服务器发送(存储在其缓存中。当他们下次向同一站点发出请求时(当然,除非您先关闭浏览器(,他们会将会话cookie发送回服务器。这样,服务器就知道哪个用户正在发出请求,并将其与服务器内存中的正确会话数据相关联。
您的 cURL 代码没有这样做,因此它可能在服务器上创建了 2 个会话。但是,完全可以使用cURL或任何其他HTTP客户端来实现这一点,这就是为什么您的想法不会阻止任何事情,只会阻止最天真的尝试调用脚本。