1

私が担当している php / IIS Web アプリケーションの Reflected XSS が原因で、PCI コンプライアンス スキャンが失敗したというレポートを受け取りました。

悪用可能なサンプル:

GET /login/recover/en?alert('TK00000105') HTTP/1.1

証拠 :

<form id='recover_form_1' method='post'  action='https://www.somebody.com/login/recover/en?alert('TK00000105')' enctype='multipart/form-data'> 

出力はフォーム クラスによって生成されます。フォーム クラスは、最近、アクションが提供されていない場合に完全なアクションを提供する機能を獲得しました (JavaScript の拡張と HTML5 検証)。このアクションは、クエリ文字列を含む完全な URL (多かれ少なかれ) です。多くの場合、クエリ文字列は、実際に読み込まれるページを決定する要素です (すべてが適切というわけではありません!)。そのため、URL からクエリをやみくもに切り離すことはできません。

フォーム アクションの URL をサニタイズするにはどうすればよいですか (どうすればよいですか)、実際にフィルタリングする必要がある危険なベクトルは何ですか?

html タグを削除するだけで十分でしょうか、それともフォームを使用するたびに特定のアクションを提供するためにこれを修正する唯一の現実的な方法ですか?

------------------ フォーム作成の詳細を編集する --------------------------

構築および開始フォーム タグは次のように生成されます。

public function __construct( $id = false, $method = 'post', $action = '', $class= '')
    {        
        $this->_method = strtolower($method);
        $this->_action = $action;
        $this->_class =  $class;

        if ($id == false) 
        {
            FormEX::$_numForms++;
            $this->_id = 'form_'.FormEX::$_numForms."";
        } 
        else 
        {
            $this->_id = $id;
        }

        FormEX::Persist($this);
        $this->Controls = new \Collection(__NAMESPACE__.'\HTMLControl');
    }

...

     public function StartForm()
        {
            $action = $this->_action != '' ? $this->_action : $this->GenerateAction();
            $class = $this->_class != '' ? " class ='{$this->_class}'" : '';
            $enc = $this->_formEnctype != '' ? $this->_formEnctype : 'multipart/form-data';
            return "<form id='{$this->getID()}' method='{$this->_method}' $class action='$action' enctype='$enc'>";
        }

コントローラー (またはビューの背後の他の場所) でフォームを作成し、ビューで次のようなものを使用します。

<?if($this->form != null): ?>
    <?= $this->form->StartForm(); ?>
    <fieldset id="<?= $this->form->getID(); ?>">
        <div class='input'>
            <?= $this->form->_rc('Confirm'); ?>
            <?= $this->form->_rc('Cancel'); ?>
        </div>
    </fieldset>
    <?= $this->form->EndForm(); ?>
<?endif ?>

--------------------- 編集 - ありがとうマレク ------------------------- ------

したがって、改善の 1 つは、URL がエンコードされていることを確認すると同時に、出力の時点で開発者が書き込み可能なすべての属性を防御的にエンコードすることです。

_s() は、htmlentities($value, ENT_QUOTES, 'utf-8')ライブラリのエンコード ショートカットです。

public function StartForm()
{
    $action = $this->_action != '' ? $this->_action : $this->GenerateAction();
    $class = $this->_class != '' ? " class ='{$this->_class}'" : '';
    $enc = $this->_formEnctype != '' ? $this->_formEnctype : 'multipart/form-data';
    $formTag = "<form id='" . _s($this->getID()) . "' method='" . _s($this->_method) . "' $class action='" . _s($action) . "' enctype='" . _s($enc) . "'>";
    return $formTag;
} 

私の質問に関して、他に注意すべきことはありますか?

ありがとう。

4

1 に答える 1