Team Ai
Apppublic

sameersyed/Defence_FrameWork

sourceHugging Faceupdated 8mo agoView on Hugging Face
0likes
app.py425 linesDownload Raw Back to root
1from flask import Flask, request, jsonify, render_template, session, redirect, url_for, make_response2from flask_cors import CORS3import pandas as pd4import numpy as np5from backend.analysis_engine import SecurityAnalysisEngine6from backend.database import Database7from backend.spam_detector_ml import ImageSpamDetector8from backend.image_security_analyzer import ImageSecurityAnalyzer9from backend.dataset_analyzer import DatasetAnalyzer10from backend.ml_risk_analyzer import MLDatasetRiskAnalyzer11from backend.adversarial_generator import AdversarialGenerator12from backend.defense_simulator import DefenseSimulator13from backend.robustness_scorer import RobustnessScorer14from backend.physical_world_analyzer import PhysicalWorldAnalyzer15from functools import wraps16 17app = Flask(__name__)18app.secret_key = 'change-this-secret-key-in-production-12345'19app.config['SESSION_TYPE'] = 'filesystem'20app.config['PERMANENT_SESSION_LIFETIME'] = 3600  # 1 hour21CORS(app)22 23# Initialize components24engine = SecurityAnalysisEngine('backend/knowledge_base.json')25db = Database()26spam_detector = ImageSpamDetector()27image_analyzer = ImageSecurityAnalyzer()28dataset_analyzer = DatasetAnalyzer()29ml_risk_analyzer = MLDatasetRiskAnalyzer()30adversarial_gen = AdversarialGenerator()31defense_sim = DefenseSimulator()32robustness_scorer = RobustnessScorer()33physical_analyzer = PhysicalWorldAnalyzer()34 35# Login required decorator36def login_required(f):37    @wraps(f)38    def decorated_function(*args, **kwargs):39        if 'user_id' not in session:40            return redirect(url_for('login'))41        return f(*args, **kwargs)42    return decorated_function43 44@app.route('/signup', methods=['GET', 'POST'])45def signup():46    """User signup"""47    if request.method == 'POST':48        username = request.form.get('username')49        email = request.form.get('email')50        password = request.form.get('password')51        52        if db.create_user(username, email, password):53            return redirect(url_for('login'))54        else:55            return render_template('signup.html', error='Username or email already exists')56    57    return render_template('signup.html')58 59@app.route('/login', methods=['GET', 'POST'])60def login():61    """User login"""62    if request.method == 'POST':63        username = request.form.get('username')64        password = request.form.get('password')65        66        user_id = db.verify_user(username, password)67        if user_id:68            session['user_id'] = user_id69            user_data = db.get_user_by_id(user_id)70            session['username'] = user_data[0]71            return redirect(url_for('ui'))72        else:73            return render_template('login.html', error='Invalid credentials')74    75    return render_template('login.html')76 77@app.route('/logout')78def logout():79    """Logout user"""80    session.clear()81    return redirect(url_for('login'))82 83@app.route('/')84def landing():85    """Serve landing page"""86    return render_template('landing.html')87 88@app.route('/ui')89@login_required90def ui():91    """Serve the chat interface at /ui endpoint"""92    return render_template('index.html', username=session.get('username'))93 94@app.route('/dashboard')95@login_required96def index():97    """Redirect to /ui"""98    return redirect(url_for('ui'))99 100@app.route('/api/chat', methods=['POST'])101@login_required102def chat():103    """Process chat messages, images, dataset info, and attack classification"""104    try:105        data = request.get_json()106        user_message = data.get('message', '').strip()107        image_data = data.get('image')108        model_type = data.get('model_type', 'general')109        110        # Store model type in session111        session['model_type'] = model_type112        113        # Handle image spam detection114        if image_data:115            analysis = image_analyzer.analyze_image(image_data)116            response_text = image_analyzer.generate_report(analysis)117        else:118            # Handle text-based security analysis119            if not user_message:120                return jsonify({'error': 'Empty message'}), 400121            122            if len(user_message) > 1000:123                return jsonify({'error': 'Message too long'}), 400124            125            # Enhanced analysis126            intent = engine.analyze_intent(user_message)127            threats = engine.classify_threats(intent['threats'])128            defenses = engine.recommend_defenses(intent['threats'])129            130            # Generate comprehensive response131            response_text = engine.generate_response(intent, threats, defenses)132            133            # Save threats to history134            for threat in threats:135                db.save_threat(136                    session['user_id'],137                    threat['name'],138                    threat['risk_level'],139                    model_type,140                    intent.get('confidence', 75)141                )142        143        # Save to database144        db.save_chat(session['user_id'], user_message or 'Analysis request', response_text)145        146        return jsonify({147            'response': response_text148        })149    150    except Exception as e:151        return jsonify({'error': f'Internal error: {str(e)}'}), 500152 153@app.route('/api/knowledge', methods=['GET'])154@login_required155def get_knowledge():156    """Return available attack types and defenses"""157    return jsonify({158        'attacks': list(engine.kb['attack_types'].keys()),159        'defenses': list(engine.kb['defenses'].keys())160    })161 162@app.route('/api/summary', methods=['GET'])163@login_required164def get_summary():165    """Return attack vs defense summary table"""166    summary = []167    for attack_id, attack_data in engine.kb['attack_types'].items():168        defenses = []169        for defense_id in attack_data['defenses'][:3]:  # Top 3 defenses170            if defense_id in engine.kb['defenses']:171                defense = engine.kb['defenses'][defense_id]172                defenses.append({173                    'name': defense['name'],174                    'complexity': defense['complexity']175                })176        177        summary.append({178            'attack': attack_data['name'],179            'risk': attack_data['risk_level'],180            'defenses': defenses181        })182    183    return jsonify({'summary': summary})184 185 186 187@app.route('/api/threat-history', methods=['GET'])188@login_required189def get_threat_history():190    """Get user's threat history"""191    threats = db.get_threat_history(session['user_id'], limit=10)192    history = []193    for threat in threats:194        history.append({195            'threat_type': threat[0],196            'risk_level': threat[1],197            'model_type': threat[2],198            'confidence': threat[3],199            'timestamp': threat[4]200        })201    return jsonify({'history': history})202 203@app.route('/api/analyze-dataset', methods=['POST'])204@login_required205def analyze_dataset():206    """Analyze uploaded dataset with risk detection and charts"""207    try:208        if 'file' not in request.files:209            return jsonify({'error': 'No file uploaded'}), 400210        211        file = request.files['file']212        if file.filename == '':213            return jsonify({'error': 'No file selected'}), 400214        215        if not file.filename.endswith('.csv'):216            return jsonify({'error': 'Only CSV files allowed'}), 400217        218        # Read CSV with error handling219        import io220        try:221            df = pd.read_csv(222                io.StringIO(file.stream.read().decode('utf-8')),223                on_bad_lines='skip',224                encoding='utf-8',225                sep=None,226                engine='python'227            )228        except Exception as e:229            file.stream.seek(0)230            try:231                df = pd.read_csv(232                    io.StringIO(file.stream.read().decode('latin-1')),233                    on_bad_lines='skip',234                    sep=None,235                    engine='python'236                )237            except Exception as e2:238                return jsonify({'error': f'CSV parsing failed: {str(e2)}'}), 400239        240        if len(df) == 0:241            return jsonify({'error': 'CSV file is empty'}), 400242        243        print(f"DataFrame loaded: {len(df)} rows, {len(df.columns)} columns")244        245        # Perform ML-based analysis246        ml_analysis = ml_risk_analyzer.analyze(df)247        248        print(f"ML Analysis complete: {len(ml_analysis['risks'])} risks found")249        250        # Generate basic charts (simplified)251        charts = {}252        try:253            if len(ml_analysis['risks']) > 0:254                charts = dataset_analyzer.generate_charts(df, {255                    'risks': ml_analysis['risks'],256                    'overall_risk': ml_analysis['overall_risk_score'],257                    'basic_info': {258                        'total_samples': len(df),259                        'total_features': len(df.columns),260                        'numeric_features': len(df.select_dtypes(include=[np.number]).columns),261                        'categorical_features': len(df.select_dtypes(include=['object']).columns),262                        'memory_usage': f"{df.memory_usage(deep=True).sum() / 1024:.2f} KB"263                    },264                    'class_distribution': {},265                    'outliers': {},266                    'duplicates': {},267                    'missing_values': {},268                    'statistics': {}269                })270        except Exception as chart_error:271            print(f"Chart generation error: {str(chart_error)}")272            charts = {}273        274        # Save to session275        session['last_analysis'] = {276            'analysis': ml_analysis,277            'charts': charts,278            'filename': file.filename279        }280        281        return jsonify({282            'analysis': ml_analysis,283            'charts': charts,284            'filename': file.filename285        })286    287    except Exception as e:288        import traceback289        print(f"Error in analyze_dataset: {str(e)}")290        print(traceback.format_exc())291        return jsonify({'error': f'Analysis error: {str(e)}'}), 500292 293@app.route('/api/download-report', methods=['GET'])294@login_required295def download_report():296    """Download HTML report of last analysis"""297    try:298        if 'last_analysis' not in session:299            return jsonify({'error': 'No analysis available. Please analyze a dataset first.'}), 400300        301        data = session['last_analysis']302        303        # Convert analysis dict to proper format if needed304        if isinstance(data.get('analysis'), str):305            import json306            data['analysis'] = json.loads(data['analysis'])307        if isinstance(data.get('charts'), str):308            import json309            data['charts'] = json.loads(data['charts'])310        311        html_report = dataset_analyzer.generate_report_html(data['analysis'], data['charts'])312        313        response = make_response(html_report)314        response.headers['Content-Type'] = 'text/html'315        response.headers['Content-Disposition'] = f'attachment; filename=dataset_report_{data.get("filename", "analysis")}.html'316        317        return response318    319    except Exception as e:320        return jsonify({'error': f'Report generation error: {str(e)}'}), 500321 322@app.route('/api/generate-adversarial', methods=['POST'])323@login_required324def generate_adversarial():325    """Generate FGSM adversarial example"""326    try:327        data = request.get_json()328        image_data = data.get('image')329        epsilon = data.get('epsilon', 0.01)330        331        if not image_data:332            return jsonify({'error': 'No image provided'}), 400333        334        result = adversarial_gen.generate_fgsm(image_data, epsilon)335        336        if result['success']:337            report = adversarial_gen.generate_report(result)338            db.save_chat(session['user_id'], 'Adversarial Attack Generation', report)339            return jsonify({'result': result, 'report': report})340        else:341            return jsonify({'error': result.get('error', 'Generation failed')}), 500342    343    except Exception as e:344        return jsonify({'error': f'Generation error: {str(e)}'}), 500345 346@app.route('/api/apply-defense', methods=['POST'])347@login_required348def apply_defense():349    """Apply defense mechanism to image"""350    try:351        data = request.get_json()352        image_data = data.get('image')353        defense_type = data.get('defense_type', 'jpeg_compression')354        355        if not image_data:356            return jsonify({'error': 'No image provided'}), 400357        358        result = defense_sim.apply_defense(image_data, defense_type)359        360        if result['success']:361            report = defense_sim.generate_report(result)362            db.save_chat(session['user_id'], f'Defense Simulation: {defense_type}', report)363            return jsonify({'result': result, 'report': report})364        else:365            return jsonify({'error': result.get('error', 'Defense failed')}), 500366    367    except Exception as e:368        return jsonify({'error': f'Defense error: {str(e)}'}), 500369 370@app.route('/api/robustness-score', methods=['POST'])371@login_required372def calculate_robustness():373    """Calculate system robustness score"""374    try:375        data = request.get_json()376        analysis_results = data.get('analysis_results', {})377        378        score_result = robustness_scorer.calculate_score(analysis_results)379        report = robustness_scorer.generate_report(score_result)380        381        db.save_chat(session['user_id'], 'Robustness Score Calculation', report)382        383        return jsonify({'score': score_result, 'report': report})384    385    except Exception as e:386        return jsonify({'error': f'Scoring error: {str(e)}'}), 500387 388@app.route('/api/physical-world-analysis', methods=['POST'])389@login_required390def physical_world_analysis():391    """Analyze physical-world attack scenario"""392    try:393        data = request.get_json()394        scenario_id = data.get('scenario_id')395        396        if not scenario_id:397            return jsonify({'error': 'No scenario specified'}), 400398        399        analysis = physical_analyzer.analyze_scenario(scenario_id)400        401        if 'error' not in analysis:402            report = physical_analyzer.generate_report(analysis)403            db.save_chat(session['user_id'], f'Physical-World Analysis: {scenario_id}', report)404            return jsonify({'analysis': analysis, 'report': report})405        else:406            return jsonify({'error': analysis['error']}), 400407    408    except Exception as e:409        return jsonify({'error': f'Analysis error: {str(e)}'}), 500410 411@app.route('/api/physical-scenarios', methods=['GET'])412@login_required413def get_physical_scenarios():414    """Get list of physical-world attack scenarios"""415    scenarios = physical_analyzer.get_all_scenarios()416    return jsonify({'scenarios': scenarios})417 418if __name__ == '__main__':419    print("\n" + "="*60)420    print("ShieldML - Deep Learning Security Analysis System")421    print("="*60)422    print("Server starting on port 7860...")423    print("="*60 + "\n")424    app.run(debug=False, host='0.0.0.0', port=7860)425