Это достаточно безопасный способ использования $ _GET - PullRequest
0 голосов
/ 14 сентября 2018

Я всего лишь программист выходного дня и работаю только над своими проектами, но я бы хотел использовать $ _GET достаточно безопасным способом.Обычно я использую $ _GET из таблицы со многими элементами, над которыми я хотел бы выполнить какое-либо действие (Редактировать, Удалить).Видят ли кто-нибудь из вас, ветеранов, какие-либо проблемы безопасности с созданными мной функциями или более простой и элегантный способ сделать это?Я ценю любой вклад, спасибо.

<?php session_start();
if (empty($_SESSION['SecretKey'])) {
    $_SESSION['SecretKey'] = bin2hex(openssl_random_pseudo_bytes(16));
}

function GetURLEncode($ArrayData,$SecretKey,$Echo = true) {
    $GetQuery = http_build_query($ArrayData,'','&');
    $Checksum = http_build_query(Array("Checksum" => hash_hmac('ripemd160', $GetQuery, $SecretKey)));
    if ($Echo) {
        echo '<a href="?'.$GetQuery.'&'.$Checksum.'">'.htmlspecialchars($ArrayData['Action']).'</a>';
    } else {
        return "?".$GetQuery."&".$Checksum;
    }
}

function GetURLDecode($GetData,$SecretKey,&$ReturnData) {
    $Checksum = $GetData['Checksum'];
    unset($GetData['Checksum']);
    $GetQuery = http_build_query($GetData,'','&');
    if (hash_equals(hash_hmac('ripemd160', $GetQuery, $SecretKey),$Checksum)) {
        $ReturnData = $GetData;
        return true;
    }
    $ReturnData = "";
    return false;
}

if (!empty($_GET)) {
    if (GetURLDecode($_GET,$_SESSION['SecretKey'],$ReturnData)) {
        echo "Array Returned<br>";
        echo var_dump($ReturnData)."<br><Br>";
    } else {
        echo "Checksum Error<br><br>";
    }
}

//Example 1
$MyArray1 = Array ("FirstName" => "John",
                   "LastName" => "Doe",
                   "Adderss" => "12345 MyStreet",
                   "City" => "Apple Valley",
                   "State" => "California");

echo "Sample 1<br>";
$URL = GetURLEncode($MyArray1,$_SESSION['SecretKey'],false);
echo '<a href="'.$URL.'">Click Me</a>';

//Example 2
$MyArray2 = Array(Array("Id" => 0,"Make" => "Chevy","Model" => "HHR"),
                  Array("Id" => 1,"Make" => "Chevy","Model" => "Corvette"),
                  Array("Id" => 2,"Make" => "Ford","Model" => "Mustang"),
                  Array("Id" => 3,"Make" => "Nissan","Model" => "Sentra"),
                  Array("Id" => 4,"Make" => "Ford","Model" => "Ranger"),
                  Array("Id" => 5,"Make" => "Dodge","Model" => "Charger"));?>
<br><br>
<table>
    <th>sample 2</th>
<?php foreach ($MyArray2 as $Array) { ?>

    <tr>
        <td><?= $Array['Make'];?></td>
        <td><?= $Array['Model'];?></td>
        <td><?php GetURLEncode(array("Id"=>$Array['Id'],"Action"=>"Edit"),$_SESSION['SecretKey']);?></td>
        <td><?php GetURLEncode(array("Id"=>$Array['Id'],"Action"=>"Delete"),$_SESSION['SecretKey']);?></td>
    </tr>
<?php } ?>

</table>

1 Ответ

0 голосов
/ 14 сентября 2018

Здравствуйте, выходные, кодер, единственная проблема, которую я вижу при использовании метода GET, заключается в том, что пользователь может напрямую изменять данные GET в URL. например, давайте возьмем, например, YouTube (по крайней мере, в тот же день), каждое видео на YouTube имеет значение GET v, и его значением является какой-то случайный 64-битный буквенно-цифровой шестнадцатеричный хэш цифр, и вы можете увидеть его непосредственно в URL youtube com/watch?v=xxxxxxxxxxxx, поскольку это так, вы можете вручную изменить это значение, и оно перенесет вас в другое видео, поскольку вы изменили video id number. это полезно, потому что вы можете скопировать эту ссылку и отправить ее своим друзьям.

с другой стороны, POST отличается тем, что вы не можете напрямую изменить отправляемые значения данных POST. хотя есть некоторые вредные способы, которые могут быть у некоторых тоже, поэтому проверка форм всегда необходима для форм и значений POST !!!

если бы мы изменили методы youtube для использования POST, все видео на youtube будут иметь youtubeDOTcom в качестве URL, а идентификатор видео будет скрыт под страницей как POST. теперь пользователь не может напрямую видеть случайный уникальный идентификатор своего видео и не может отправить ссылку другим пользователям для обмена.

Надеюсь, это немного объясняет, это зависит от того, какую информацию вы отправляете. если вы считаете, что он должен быть защищен и доступен не всем пользователям, используйте POST. если вы хотите, чтобы ссылка передавалась и изменялась часто для просмотра разных страниц, мультимедиа и т. д., что не является конфиденциальным, вы можете использовать GET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...