2016-04-19 12 views
0

現在、私はフォームを使用して "コメント"を投稿し、データベースに保存しています。2つの隠しフィールドがあり、1つはコメントの構成要素を確認し、もう1つは隠しフィールドです。コメント番号。しかし私は私自身の形で悪用を見つけました。私が開発者用コンソールに入ると、コメントを他のフォームに、あるいは存在しないものにクロスポストするように変更することができます。これは本当に問題ではありませんし、コメントの数を変更することもできません。同じ番号のコメントがある場合でも正しく動作するためです。安全でないフォームのポスト値の検証

<form action="/index.php?option=com_comments&view=comment&row=<?= $row ?>&table=<?= $table ?>" method="post"> 
<input type="hidden" name="row" value="<?= $row ?>" /> 
<input type="hidden" name="table" value="<?= $table ?>" /> 

<textarea type="text" name="text" class="control control--textarea control-group__control" placeholder="<?= translate('Add new comment here ...') ?>" id="new-comment-text"></textarea> 
<br /> 
<input class="leader btn btn--theme control-row__trigger" type="submit" value="<?= translate('Comment') ?>"/> 

しかし、問題は、私は、コンソールに行き、私は追加してフォームを送信したときに、私は実際に私は他の誰かだと値とポストをオーバーライドすることができるということです。他の人として投稿できるようにすることは明らかに意図された動作ではありません。ポストが送信される前にcreated_byの値を検証する方法を見つけることができないようです。非表示の入力フィールドに入れても同様に変更できるからです。これを安全にするために私は何ができますか?

編集:転記は自動的に行われ、使用しているフレームワークのために私は文字通り何も変更できません。そして、適切なデフォルト動作を上書きします。私の質問にフレーズを付けるより良い方法は、ユーザーが特別な隠し入力フィールドを追加して余分な値を投稿するのを防ぐことができますか?投稿にcreated_byが含まれていて、それが現在のprofile_idに変更されている場合、毎回フォーム投稿チェックを投稿する必要がありますか?

悪意のあるコードは、あなたがセッションIDを使用することができる代わりに、ユーザIDと一緒にデータベース

[php] 

$userHash = $db->prepare('SELECT user_hash FROM user WHERE id = :uId')->scalar([':uId' => $this->getUserId()]); 

if (!empty($_SESSION['userHash']) && $_SESSION['userHash'] == $userHash) { 
    // process form 
    // generate new user hash 
} else { 
    die('!HACKER!'); 
} 

とのセッションやクッキーを使用することができデベロッパーコンソール経由

<form action="/index.php?option=com_comments&amp;view=comment&amp;row=2&amp;table=blogs_blogs&amp;created_by=6" method="post" class="ng-pristine ng-valid"> 
<input type="hidden" name="_token" value="a0b15d3664d7bc0e0e40675095fec014"> 
<input type="hidden" name="_token" value="a0b15d3664d7bc0e0e40675095fec014"> 
    <input type="hidden" name="row" value="2"> 
<input type="hidden" name="created_by" value="6"> 
    <input type="hidden" name="table" value="blogs_blogs"> 

    <textarea type="text" name="text" class="control control--textarea control-group__control" placeholder="Add new comment here ..." id="new-comment-text"></textarea> 
    <br> 
    <input class="leader btn btn--theme control-row__trigger" type="submit" value="Comment"> 
</form> 
+0

created_byの生成方法を示すコードを投稿できますか? – larsAnders

+0

この ''は '<?php echo $ row; ?>「好奇心から」 –

+2

@クルシオビダ同じことをする。 – Justinas

答えて

1

ルール#1:は、ユーザーがログインしている場合、クライアント

を信用していないセッションでは、ユーザーのIDを格納し、専用のデータベースに彼/彼女のレコードを格納するためにその識別子を使用してくださ。

さらに、フォームにCSRF(クロスサイトリクエスト偽造)を防止するメカニズムを実装する必要があります。私はそれがそうであることを見ることができないので。

+0

これは既に行われていますが、特定の「魔法」要素を持つNookuというHMVCフレームワークを使用しています。自分自身をCreated_Byに追加すると、私が投稿と一緒にそれを送るのは、それが送信されないときのデフォルトの処理を超えてしまうからです。それはすでに現在ログインしている人物を取得して通常どおりに置いていますが、自分で入力を追加すると上書きされます。 –

+1

質問を編集し、環境に関する詳細を指定していただきありがとうございます。あなたのフォームに_tokenを追加したことを確認してうれしいです。ユーザーが新しい隠し入力フィールドを追加してcreated_by idを上書きしようとしても、フォームコントローラはセッションのユーザーのIDのみを使用してこれを防止する必要があります。確かに、フレームワーク(サブクラスなど)のデフォルトの動作を上書きすることができます。そうでなければ、これはIMHOのフレームワークにおけるセキュリティ上の脆弱性であり、開発者に連絡する必要があります。 – st2erw2od

+0

したがって、ページが生成された後に余分な入力フィールドの追加を検出する直接的な方法はありません。隠された入力フィールドの使用に代わる方法がありますか?ユーザーが入力できる可能性のあるすべてのフィールドについて、私がしなければならない検証の量のように思えるので、かなり多く入力します。 また、悪意のあるユーザーがデータベースの構造を知らないため、彼にとっては少し難しく、一部のフィールドでは「推測できない」と疑われていますが、誰かが決して推測できないことは考えられません列の名前は安全な機能です。とにかく洞察力に感謝します。 –

0

を変更しました。 Webアプリケーションのセキュリティで

0

それは実際にサーバーにポストだ前に私が適用されるの振る舞いには、このチェックを追加することにより、

public function createdbycheck(Library\CommandContext $context) 
{ 
    $context->request->data->created_by = null; 
} 

それを固定するだけNULLにそれを設定し、それはデフォルトの動作によって処理されます。

関連する問題