Php 我想建立一个安全的链接

Php 我想建立一个安全的链接,php,mysql,redirect,random,Php,Mysql,Redirect,Random,我想做一个代码生成器链接,比如 www.website.com/register?code=29U3HTR3H219URH923UH419H94RH1298491U2HERUH1?购买计划=低价经销商 在php上的函数文件中,该文件正在重定向该链接上的用户 $planned = htmlspecialchars($_GET["planbought"]); // connect to database $db = mysqli_connect('localhost', 'root', 'pass'

我想做一个代码生成器链接,比如

www.website.com/register?code=29U3HTR3H219URH923UH419H94RH1298491U2HERUH1?购买计划=低价经销商

在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);
?>
流程:付款后,paypal将在上重定向用户

该链接将在数据库中创建一个代码,并在上重定向用户


现在的问题是,我被重定向到“”上,而不是“在数据库中创建的代码,如‘J2498JT9UJ249UTJ293UJ59U123J9RU9U’”

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

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

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

*您生成的“安全”代码是可预测的(正如您所使用的),如果您需要在PHP7.0之前以及PHP7.0或更高版本中查看安全代码,如所示


此外,正如您的代码所提到的,SQL注入很容易受到攻击。请参阅如何防止SQL注入。

除了Tom Udding回答中提到的问题外,至少还有两个其他问题:

  • 函数\u generate-ak9esysgenthos.php
    完全可以在无需任何身份验证的情况下访问。此外,它盲目地生成“安全代码”,而不确定用户是否登录或以其他方式授权访问该页面(例如,不确定支付操作是否正在进行)。这可以让任何了解URL的人访问
    函数\u generate-ak9esysgenthos.php
    ;根据应用程序的实现方式,这可能会导致未付款的订单,甚至是拒绝服务攻击(由于额外的订单代码阻塞了数据库)

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


“我想建立一个安全链接”甚至不要使用此代码(盲)SQL注入在INSERT中也是一件事,我不知道你到底要传递给paypal的url是什么,但在上面的url中,你使用了
作为查询参数的分隔符,但它必须是
&
?foo=bar&bar=foo
一样,我将创建一个系统来停止SQL注入。我只使用一个url参数,所以,我不需要使用“&”。“我将创建一个系统来停止sql注入”系统来停止sql注入?你的意思是什么?我希望你只是指我将使用准备好的语句来进行注释。@RaymondNijland我的意思是复制下面答案的链接,它正确地使用了
openssl\u random\u pseudo\u bytes()
/
random\u bytes()
。谢谢你让我知道!PHP7有
random_int()
random_bytes()
,它们在加密方面确实是安全的。@RaymondNijland我已经更新了我的答案,包括这些:)同样的问题,我输入了“”(这将由paypal在交易结束时使用)@TopKenzo我建议您删除上一条评论中的凭据。关于您以前的评论,您能否启用错误报告并确保在设置标题之前没有发生任何错误?我想重定向到注册页面,您不需要登录,它将生成一个代码,之后将允许您注册