Нейтрализация Python Flask XSS (предупреждение Veracode) - PullRequest
0 голосов
/ 01 апреля 2019

Привет, у меня есть следующий фрагмент кода, который вызывает предупреждение о Veracode:

@app.route('/user/<username>', methods=['GET'])
@login_required
def user(username):
    username = str(escape(username))
    if current_user.username == username:
        user = User.query.filter_by(username=username).first_or_404()
        all_regions = Region.query.all()
        return render_template('user_bs.html', user=user, all_regions=all_regions,
                               production_mode=app.config['PRODUCTION_MODE'],
                               manual_registration=app.config['AUTHENTICATION_METHODS']['MANUAL'])
    return redirect(url_for('index'))

Я пытаюсь понять, что я могу сделать, чтобы нейтрализовать его.

В user_bs.html template Я правильно окружаю свои переменные фигурными скобками, двойными кавычками и т. д ... Что еще я могу сделать, чтобы предотвратить XSS?

Это шаблон:

{% extends "base.html" %}

{% block app_content %}
<div>
    <table class="table">
        <h3>My Profile</h3>
    <tr >
        <td>
            <h1><img src="{{ user.avatar(32) }}"> {{ user.fullname }} </h1>
            <p>Info: {{ user.description }}</p>
            <p>Username: {{ user.username }}</p>
            <p>Role: {% for role in user.roles %} {{ role }} {% endfor %}</p>
            <p>Email: {{ user.email }}</p>
            <p>Creation date: {{ user.creation_dt }}</p>
            {% if user.last_seen %}<p>Last seen on: {{ user.last_seen }}</p>{% endif %}
        </td>
    </tr>
    </table>
</div>
{% endblock %}

И base.html :

{% extends 'bootstrap/base.html' %}

{% block title %}
    {% if title %}{{ title }}
    {% elif frontend %} {{ frontend.name }} - test
    {% else %} test
    {% endif %}
{% endblock %}

{% block head %}
<meta charset="UTF-8">
{{super()}}
<link rel="icon" type="image/png" href="{{url_for('static', filename='images/favicon.ico')}}">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css">
{% endblock %}
{% block navbar %}
<div id="main">
    <nav class="navbar navbar-default">
        <div class="container-fluid">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="{{ url_for('index') }}"><img src="{{url_for('static', filename='images/logo_navbar.png')}}" width="90px" alt="test" /></a>
                {% if frontend %}
                    {% if frontend.analytics %}
                        <button id='toggle_analytics' class="btn btn-default navbar-btn active"><span class="glyphicon glyphicon-signal"></span>&nbsp Dashboard</button>
                        <button id='toggle_filters' class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-tasks"></span>&nbsp Reports</button>
                    {% else %}
                        <button id='toggle_filters' class="btn btn-default navbar-btn active"><span class="glyphicon glyphicon-tasks"></span>&nbsp Reports</button>
                    {% endif %}
                {% endif %}
            </div>
            <ul class="nav navbar-nav">
                {% if frontends|length > 0 %}
                    {% for region in regions|sort(attribute='name') %}
                        {% set prod_lst = [] %}
                        {% for frontend in frontends %}
                            {% if frontend.region == region and frontend.activate %}
                               {% set prod_lst = prod_lst.append(frontend.product) %}
                            {% endif %}
                        {% endfor %}
                            <li class="dropdown">
                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ region.name }} <span class="caret"></span></a>
                                <ul class="dropdown-menu">
                                    {% for product in products|sort(attribute='name') %}
                                    {% if product in prod_lst %}
                                                <h6 class="dropdown-header">{{ product.name }}</h6>
                                        {% for frontend in frontends|sort(attribute='name') %}
                                            {% if frontend.region == region and frontend.product == product %}
                                                {% if frontend.activate %}
                                                    <li><a href="{{ url_for('dashboard', product_code=frontend.product.product_code, frontend_code=frontend.frontend_code) }}">{{ frontend.name }}</a></li>
                                                {% endif %}
                                            {% endif %}
                                        {% endfor %}
                                    {% endif %}
                                {% endfor %}
                                </ul>
                            </li>
                    {% endfor %}
                {% endif %}
                </ul>
                <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                    <ul class="nav navbar-nav navbar-right">
                        {% if frontend %}
                            <p class="navbar-text align-right animated fadeInLeftBig animation-duration-500ms delay-3s" align="right"> {{ frontend.name }} :: <span class="glyphicon glyphicon-time"></span> {{ frontend.timezone.name }} :: <span id="clock"></span> </p>
                        {% else %}
                            <p class="navbar-text align-right animated fadeIn animation-duration-500ms" align="right"><span id="clock"></span> </p>
                        {% endif %}
                        {% if current_user.is_anonymous %}
                            <li><a href="{{ url_for('login') }}">Login</a></li>
                        {% else %}
                            <li><a href="{{ url_for('index') }}"><span class="glyphicon glyphicon-home"></span></a></li>
                            <li><a href="{{ url_for('user', username=current_user.username) }}" title="Profile {{ current_user.username }}"><span><img src="{{ current_user.avatar(20) }}"></span></a></li>
                            {% if current_user.roles[0].name == 'Admin' %}
                                <li><a href="{{ url_for('admin.index') }}"> <span class="glyphicon glyphicon-cog"></span> </a></li>
                            {% endif %}
                            <li><a href="{{ url_for('logout') }}" title="Logout"> <span class="glyphicon glyphicon-log-out"></span></a></li>
                        {% endif %}
                    </ul>
                </div>

        </div>
    </nav>
{% endblock %}

{% block content %}
    <div class="container-fluid animated fadeIn animation-duration-100ms">
        {% block app_content %}
        {% endblock %}
    </div>
</div>
{{super()}}
{%- block footer %}
<footer class="text-center">&copy; 2019 test</footer>
{%- endblock footer %}
{% endblock content%}
{% block scripts %}
{{super()}}
<script src="{{url_for('static', filename='js/animate/custom.js')}}"></script>
{% endblock %}

1 Ответ

0 голосов
/ 01 апреля 2019

Я исправил это, просто изменив маршрут:

@app.route('/user', methods=['GET'])
@login_required
def user():
    user = User.query.filter_by(username=current_user.username).first_or_404()
    all_regions = Region.query.all()
    return render_template('user_bs.html', user=user, all_regions=all_regions,
                           production_mode=app.config['PRODUCTION_MODE'],
                           manual_registration=app.config['AUTHENTICATION_METHODS']['MANUAL'])
...