2016-12-14 14 views
-1

私は初心者ですが、私はCRUDシステムを構築しましたが、それはまったく安全ではありません。編集ページにはURLにID番号があり、ユーザは単純にデータベースの他のレコードにアクセスするためにIDをランダムに入力することができます。UR1内のPHP/MySQL暗号化ID

http://example.com/example_edit.php?id=2

<?php 

include_once("connection.php"); 


$result = mysqli_query($mysqli, "SELECT * FROM mkregistrationchecklists WHERE login_id=".$_SESSION['id']." ORDER BY id DESC"); 
?> 

<tbody> 
<?php 
while($res = mysqli_fetch_array($result)) {   

    echo "<tr>"; 
    echo "<td>".$res['id']."</td>"; 
    echo "<td><span class='label ".$res['labelwarning']."'>".$res['status']."</span></td>"; 
    echo "<td>".$res['todaysdatetime']."</td>"; 
    echo "<td>".$res['tag']."</td>"; 
    echo "<td>".$res['serialnumber']."</td>"; 
    echo "<td>".$res['currentequipment']."</td>"; 
    echo "<td>".$res['company']."</td>"; 

    if ($res['status'] == "Submitted") { 
    echo "<td><a href='page_read.php?id=$res[id]' class='btn btn-default glyphicon glyphicon-eye-open'></a></td>"; 
} else{ 
    echo "<td><a href=\"page_edit.php?id=$res[id]\" class='btn btn-default fa fa-pencil-square'></a> | <a href=\"page_delete.php?id=$res[id]\" class='btn btn-danger fa fa-trash' onClick=\"return confirm('Are you sure you want to delete?')\"></a></td>"; 
} 

    echo "</tr>"; 



} 
?> 
</tbody> 

これを確保する上で最善のアプローチは何ですか?

このように暗号化する必要がありますか?

$secure_id = $_GET['id']; 
$decryped_id = base64_decode($secure_id); 

私はlogin_idに従ってレコードを保存していますが、それでもURLのidタグでは専門家ではないように見えます。

+0

ベース64エンコーディングは暗号化ではなく*暗号化です。 IDを非表示にするには、トークン(塩漬けのハッシュ、さらにはUUID)を生成する必要があります。このトークンは、レコードの他の情報と一緒にデータベースに格納します。 –

+1

これはセキュリティに関連していませんが、これは開発アーキテクチャです。まず、IDが1,2,3,4のレコードにアクセスする権限を持っているユーザーであることを覚えておいてください。URIを介してページを手動で切り替えることができます。あなたのユーザーがすべてのレコードIDにアクセスしてレコードを編集する権限を与えられているかどうかは関係ありません。要求しているIDが現在のユーザーに許可されているかどうかにかかわらず、ページの上部にチェック(ミドルウェア)を配置する必要があります。 – webDev

+1

また、最も重要なことは(@ Shaileshが言ったように)パーミッションをチェックしていることです。とにかく権限のないアクセスをブロックした場合、ユーザーがアイテムIDを知っている場合は誰が気にしますか?あなたがやっていることが情報を不明瞭にしているのであれば、それは曖昧さによるセキュリティと呼ばれ、それは良いアイデアではありません。ユーザーが提供するアイテムIDに関係なく、データの表示/更新/削除の権限を確認する必要があります。 –

答えて

0

あなたは一般的に、すべてのSQLクエリにユーザー/レコード所有者固有の識別を追加する必要があります。

$query = "SELECT * FROM table WHERE id = 1 AND user_id = 2"; 

このアプローチでは、ユーザーのアクセスが唯一の彼のレコードのことを確認することができます。ログインしたユーザーのIDはSESSIONのどこかに置くことができます。

IDの非表示やハッシングは推奨されていません。アンチパターンであり、security through obscurityです。

+0

しかし、彼が自分のデータテーブルにuser_idを持っていない場合は、record_idとuser_idの関係を設定してflyをチェックできる新しいテーブルを作成するだけです。 – webDev

+1

はい、確かに、具体的な実装は彼のユースケースに依存しますが、これは実証目的のためだけです。 – Artegon