我想建立一个安全的链接

时间:2019-11-07 10:31:01

标签: php mysql redirect random

我想建立一个代码生成器链接,例如

www.website.com/register?code=29U3HTR3H219URH923UH419H94RH1298491U2HERUH1?plan_bought=LowReseller

在php上的功能文件中,该文件正在重定向该链接上的用户。

$planned = htmlspecialchars($_GET["planbought"]);
// connect to database
$db = mysqli_connect('localhost', 'root', 'pass');
mysqli_select_db($db,"ronp");


function generateRandomString($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}

$code_secure = generateRandomString(17);  // OR: generateRandomString(24)

$query = "INSERT INTO codes (code, expired, 'date', plan) 
                      VALUES('$code_secure', '0', date, '$planned')";
mysqli_query($db, $query);

header('Location: register?code=', $code_secure);
?>

流程:付款后,贝宝将在https://website.com/functions_generate-ak9esysgenthos.php?planbought=Low上重定向用户

该链接将在数据库中创建代码,并将重定向https://website.com/register?code_secure=(code)上的用户

现在的问题是,我被重定向到“ https://website.com/register?code=”,而不是数据库中创建的“ https://website.com/register?code=(the”代码,例如“ J2498JT9UJ249UTJ293UJ59U123J9RU9U”)”

2 个答案:

答案 0 :(得分:1)

如果您查看header()的文档,则会看到第二个参数是布尔值。此参数指定是否应“强制”替换标题。您不正确地将“安全” *代码作为该参数传递。

您想要做的是concatenate字符串,而不是将“安全”代码作为第二个参数传递。你想得到的是

header('Location: register?code=' . $code_secure);

*您生成的“安全”代码是可以预测的(如您使用this code一样),如果您需要安全代码,则可能希望在PHP 7.0和{{3}之前使用openssl_random_pseudo_bytes }(在PHP 7.0或更高版本中,如random_bytes()所示。

此外,如this answer所述,您的代码容易受到SQL注入的攻击。有关如何防止SQL注入的信息,请参见Raymond Nijland

答案 1 :(得分:0)

除了汤姆·乌丁(Tom Udding)回答中提到的问题外,至少还有两个其他问题:

    完全不需要任何身份验证即可访问
  • functions_generate-ak9esysgenthos.php。此外,它盲目生成“安全代码”,而无需确定用户是否已登录或是否有权访问该页面(例如,无需确定是否正在进行支付操作)。这可以允许任何了解URL的人访问functions_generate-ak9esysgenthos.php;取决于您应用程序的实施方式,这可能导致未付款的订单甚至拒绝服务攻击(由于其他订单代码阻塞了数据库)。

  • 您正在生成随机的“安全代码”,而不检查该代码是否已被使用。如果/register?code=...找到两条具有相同代码的记录怎么办?您的应用程序可以承受为不同的记录生成相同代码的风险吗? (另请参阅我的section on unique random identifiers。)