Я хочу сделать безопасную ссылку - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу создать ссылку на генератор кода, например

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);
?>

Процесс: после оплаты PayPal перенаправит пользователя на https://website.com/functions_generate-ak9esysgenthos.php?planbought=Low

Эта ссылка создаст код в базе данных и перенаправит пользователя на https://website.com/register?code_secure=(code)

Теперь проблема в том, что яполучить перенаправление на "https://website.com/register?code=",not" https://website.com/register?code=(the код, созданный в базе данных, например, 'J2498JT9UJ249UTJ293UJ59U123J9RU9U') "

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Если вы посмотрите документацию для header(), вы увидите, что второй параметр является логическим значением. Этот параметр указывает, должен ли заголовок быть «принудительно» заменен. Вы неверно передаете свой «безопасный» * код в качестве этого параметра.

Что вы хотите сделать, это объединить строки вместо передачи своего "безопасного" кода в качестве второго параметра. То, что вы хотите получить:

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

* «Безопасный» код, который вы генерируете, является предсказуемым (так как вы использовали этот код ), если вам нужен безопасный код, который выВозможно, вы захотите взглянуть на openssl_random_pseudo_bytes до PHP 7.0 и random_bytes() в PHP 7.0 или выше, как продемонстрировано в этого ответа .

Кроме того, как отметил Раймонд Нейланд , ваш код уязвим для SQL-инъекций. См. этот превосходный ответ о том, как можно предотвратить SQL-инъекции.

0 голосов
/ 07 ноября 2019

Помимо проблем, упомянутых в ответе Тома Уддинга, есть по крайней мере две другие проблемы:

  • functions_generate-ak9esysgenthos.php могут быть доступны без какой-либо аутентификации вообще. Более того, он генерирует «безопасный код» вслепую, не определяя, вошел ли пользователь в систему или иным образом авторизован для доступа к этой странице (например, не определяя, выполняется ли операция оплаты). Это может позволить любому, кто знает URL, получить доступ к functions_generate-ak9esysgenthos.php;в зависимости от того, как реализовано ваше приложение, это может привести к тому, что заказы не были оплачены, или даже к отказу в обслуживании (из-за дополнительных кодов заказа, забивающих вашу базу данных).

  • Выгенерируют случайный «безопасный код», не проверяя, был ли этот код уже использован. Что если /register?code=... найдет две записи с одинаковым кодом? Может ли ваше приложение переносить риск создания одного и того же кода для разных записей? (См. Также мой раздел об уникальных случайных идентификаторах .)

...