我只是一个周末编码器,只能在我自己的项目上工作,但我想以合理安全的方式使用$ _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>
你好周末编码器,我看到使用GET方法的唯一问题是用户可以直接更改网址中的GET数据。例如,让我们以youtube为例(至少在当天回来),每个youtube视频的GET值为v
,它的值是一些随机的64位字母数字十六进制数字哈希,你可以直接在URL youtube com/watch?v=xxxxxxxxxxxx
中看到它,因为这是这样,您可以手动更改此值,它将带您到另一个视频,因为您更改了video id number
。这很有用,因为您可以复制此链接并将其发送给您的朋友。
另一方面,POST是不同的,因为您无法真正直接更改正在发送的POST数据值。虽然有一些恶作剧方式也可能,但这就是为什么POST表格和价值总是需要表格验证!
如果我们改变youtube的方法来使用POST,那么所有youtube视频都会将youtubeDOTcom作为URL,并且视频ID将作为POST隐藏在页面下方。现在用户无法直接看到他们视频的随机唯一ID,也无法将链接发送给其他人进行共享。
希望这解释一下,这取决于您发送的信息类型。如果您认为它应该是安全的并且对所有用户都不可见,请使用POST。如果您希望共享链接并经常更改以查看不保密的不同页面,媒体等,您可以使用GET