2017-11-06 6 views
0

私はphp(PDO)とMySQLで書かれた簡単な連絡先データベースアプリケーションを持っています。これは、switch case文を持つ単一のファイルです。デフォルトでは、連絡先のテーブルが表示されます。大文字と小文字は、機能の追加、編集、削除などです。すべてのMySQLステートメントは、PDOで準備されたステートメントです。パラメータを持つhtmlリンク、またはパラメータを隠しフィールドとしてPOSTを作成する - セキュリティなど

私の質問は: 移動するにはパラメータ付きのHTMLリンクを使用する方が良いですか、パラメータを隠しフィールドとして使用する方がよいでしょうか。

<a href="?mode=edit&contact_id=321">edit</a> 

およびスイッチのための「モード」および$ _GETの文

からパラメータを取得したり、より良い、それを次のとおりです。それぞれの行は、それがより良いリンクを持つことである内のテーブルには、連絡先をリストアップ持っている:

<form method="POST" action=""> 
    <input type="hidden" name="mode" value="edit"/> 
    <input type="hidden" name="contact_id" value="321" /> 
    <input type="submit" name="submit" value="edit" /> 
</form> 

私はセキュリティの視点と機能の観点から興味があります。私はここで似たような質問をしてきましたが、フォームが良かったと答えた回答が1つしかありませんでした。それは説明と4つのアップノートを持っていなかった。

すべての情報をいただければ幸いです。 乾杯。

答えて

1

は、フォームと一緒に行く方がよいでしょう。です。どうして? URLナビゲーションはGETリクエストで送信され、<form>投稿はPOSTで処理されます。 GETリクエストはexposed to the end-userですが、POSTリクエストはありません。以前のリンクのTeamTreeHouseが指定した通り:

機密データを扱う場合はPOSTを使用してください。

以前のアプローチを考えてみましょう。ユーザーがブラウザにindex.php?mode=edit&contact_id=321が表示されていることを確認します。彼らが悪意のある人であれば、容易に相関をindex.php?mode=edit&contact_id=1にすることができます。彼らは簡単にそれをブラウザに入力することができます。他の認証機構が設定されていないと仮定すると、go aheadになり、他人のアカウントを編集することができます。

後者は少し良いです。公開されたURLほどソースコードは明らかではありませんが、誰でもまだ閲覧でき、隠された321連絡先を見つけることができます。悪意のあるユーザーはhiddenというフォームフィールドを編集できないと思うかもしれません。彼らはあなた自身のコピーをダウンロードして作成することができます。単にactionのパラメータを独自のものに置き換えて改ざんされたデータを送信します。これはさらに簡単になりますbrowser addonsもあります!

これを回避するには、<form>メソッドをauthentication tokenと組み合わせることを検討しています。生成された後にフォームが操作されないように、フォームの整合性を検証するトークンを生成します。トークンの生成方法についてはバックエンドでどの言語を使用しているのかによって異なりますが、JSON Webトークンの記事はhereです。

フォームの提出時に、トークンが生成時と一致していることを確認します。一致する場合はすべて正常ですので、処理を進めます。そうでない場合は、フォームが操作されているため、提出を拒否します。

詳細については、Cross-Site Request ForgeriesのOWASP's articleをチェックすることをおすすめします。

希望すると便利です。 :)

+0

非常に便利です、ありがとうございます。私はもっ​​と広い意味で考えていると思います。私はPDOと準備された声明がMySQLの注射攻撃から私のコードを保護していることを知っています、私は私が気づいていない他の悪用からの攻撃に私を開いたままにしていないフォームを使用していることを確認したかっただけです。私は独学で教えていますし、私の知識は少しばかりです。私のアプリケーションは、httpsサイトのメンバーシップウォールの背後にあります。 – Almeister9

+0

HTTPSは誠実にCSRFからあなたを保護しませんが、認証トークンがフォームを保護します。準備されたステートメントは**大きな**予防策ですが、データベース自体の[**最小特権**の原則**](https://en.wikipedia.org/wiki/Principle_of_least_privilege)も選択する必要があります。また、WikiHowは実際にPHP/MySQLiコンボをカバーするための[**素晴らしい記事**](https://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL)を持っていますPDOに簡単に適応できる側面の**トン** –

関連する問題