0

私の以前の投稿から学んだ限りでは、を呼び出した後xss_cleanにフィルタリングします。問題は、コールバック関数でもフィルタリングされるかどうかです。$this->input->post('text_url')$this->form_validation->run()$this->input->post('textarea_content')

ありがとう

$this->form_validation->set_rules('text_url', 'Website link', 'trim|xss_clean|callback_minimum_fields[' . $this->input->post('textarea_content') . ']');

$this->form_validation->run();

//Filtered
$text_url = $this->input->post('text_url');

//Filtered as well?
$textarea_content = $this->input->post('textarea_content');

折り返し電話

public function minimum_fields($url, $content)
{
    if ($url == '' && $content == '')
    {
        $this->form_validation->set_message('minimum_fields', 'Please provide info for at least one of these: "Website link" and "Content".');
        return false;
    }

    return true;
}
4

2 に答える 2

2
//Filtered as well?
$textarea_content = $this->input->post('textarea_content');

いいえ、フォーム検証で「準備」ルールを設定していません。実際、textarea_contentフィールドをまったく検証していません。

その上、ルールを設定した時点ではフォームの検証を実行していないため、POST データをコールバック関数に渡すと元のデータになります。

ルールが単なる文字列であるこのようなポスト データをコールバックに渡すことは非常に危険であり、スクリプトが壊れる可能性があります。検討:

$_POST['textarea_content'] = ']|var_dump|exit|some_nonsense[';

$this->form_validation->set_rules(
    'text_url',
    'Website link',
    'callback_minimum_fields[' . $this->input->post('textarea_content') . ']'
);

// Produces this rule:
// callback_minimum_fields[]|var_dump|exit|some_nonsense[]

これらの「ルール」は、フォーム検証ルールに挿入されます。このコンテキストでは、それは単なる文字列だからです。コールバックに postdata を直接読み取らせるか、別の方法を採用する方がよいかもしれませんが、これは非常に安全ではありません。最初に xss_clean しても問題ありません。

もう一度言いますが、XSS とは何かを理解するのにもっと時間を費やしてから、この状況で心配する意味があるかどうかを判断してください。XSS はoutputでのみ発生します。

于 2012-12-07T15:48:41.200 に答える
0

したがって、当然のことながら、フィールドを選択し、それを必須にしてから、検証に必須にすることは明らかです。しかし、あなたが言っていることが - これらのフィールドのいずれかまたは他のものが必須である場合 - フィールドの検証後に別のチェックとしてそれを行うこともできます.

そして、これはユーザビリティの観点から理にかなっています - 通常の検証は PER FIELD で行われます。エラーメッセージはフィールドに関連付けられています。複数のフィールドに関する要件がある場合、そのメッセージは個別に表示されます。

そして、ここに XSS クリーンのための簡単な CI のヒントがあります。TRUE を次のように使用してください。

// adding TRUE means we are filtered
$text_url = $this->input->post('text_url', TRUE);
$textarea_content = $this->input->post('textarea_content', TRUE);

 // check if both fields came back blank
if( $text_url == '' && $textarea_content == '' ) 
{
// validation failed, show the form again, make your own message to pass to view
}
else
{
// its all good
} 
于 2012-12-08T02:13:33.187 に答える