Skip to content
Go back

Security Considerations When Participating in Software Development Projects

Published:  at  02:55 AM

“Security is everyone’s responsibility.” — A familiar saying, but in real projects, it’s often forgotten.

In today’s software projects, security is not just the responsibility of the Security team but of the entire development team — from Developers, DevOps, QA, project managers, to the organization. Most security incidents don’t come from super-sophisticated hackers but from basic human errors: accidentally committing API tokens to public repositories, sharing configuration files via email, opening test ports and forgetting to close them, or testing systems with real data without deleting it afterward.

For security to become culture and habit, it must be integrated from the design phase and throughout the Software Development Lifecycle (SDLC). This article analyzes in detail the various roles, common risks, supporting tools, best practices, and prevention methods to build a truly secure software project.

1. Developer — Security Responsibility in Code

Developers are the front line of software security, because all data and system logic start from code. One insecure line of code can lead to serious risks affecting the entire application.

Don’t Expose Sensitive Information

Problem: Accidentally committing .env, appsettings.json, config.yml files containing database passwords, API keys, secret keys to GitHub is one of the most common and serious mistakes.

Solutions:

Validate Input Data

Problem: Absolutely trusting user input is a disaster. SQL Injection and Cross-Site Scripting (XSS) errors both originate from here.

Solutions:

Use Safe Libraries

Problem: “Supply Chain Attack” — attackers inject malicious code into a popular open-source library you’re using.

Solutions:

Proper Logging

Problem: Logging passwords, credit card numbers, or JWT tokens turns log files into treasure troves for hackers.

Solutions:

Code Review and Security Review

Solution: Every Pull Request/Merge Request should be reviewed by at least one other person, with a specific security checklist. Combine with Static Application Security Testing (SAST) tools like SonarQube, Checkmarx to automate finding potential vulnerabilities in code.

2. DevOps / Infrastructure — Security Responsibility for Infrastructure and Pipeline

Secure Pipeline (CI/CD)

Problem: Hardcoding secrets in CI/CD scripts.

Solution: Use built-in secret storage of CI/CD systems (GitHub Secrets, GitLab CI Variables, Azure DevOps Secret Variables). Configure manual approval for deployment steps to production environments.

Environment Access Control (Principle of Least Privilege)

Solutions:

Secure Containers and Infrastructure

Solutions:

Monitoring and Incident Response

Solution: Deploy monitoring systems (Prometheus, Datadog) and centralized logging (ELK Stack). Set up alerts for abnormal behavior: repeated failed logins, sudden traffic spikes. Have an Incident Response Plan ready for when incidents occur.

3. Project Management — Security Responsibility for Process and Personnel

Establish Security Processes

Action: Make “Security Review” a mandatory part of the Definition of Done (DoD) for every user story. Create a simple, easy-to-understand security checklist for the entire team.

Personnel and Access Management

Action: Apply Single Sign-On (SSO). Revoke access immediately when employees change teams or leave the company. Review access rights quarterly.

Training and Awareness

Action: Organize internal sharing sessions on OWASP Top 10, how to identify phishing emails. Encourage a culture of reporting bugs without fear of punishment.

4. QA / Tester — Security Responsibility for Testing and Data

Basic Security Testing

Action: Play the role of an attacker. Try entering script snippets (<script>alert('XSS')</script>) into forms, or special SQL characters (' OR '1'='1) into search boxes. Use tools like OWASP ZAP to automate vulnerability scanning.

Role-Based Testing

Action: Ensure User A cannot view User B’s information by changing IDs in URLs (Insecure Direct Object Reference - IDOR). Thoroughly test admin/regular user permission features.

Environment Testing

Action: Absolutely never use real data (especially customer information) in Staging/Test environments. Use generated fake data.

5. Organization — Responsibility for Building Security Culture and Policies

Security Policies and Procedures

Action: Build a clear Security Policy document, specifying password requirements, data handling, and incident response.

Periodic Audits and Assessments

Action: Hire an independent third party to perform Penetration Testing at least once a year for an objective and in-depth perspective.

”Security First” Culture

Action: Leadership must drive and champion security culture. Reward those who find serious vulnerabilities.

6. Threat Modeling — Analyzing Risks from the Start

This is the process of identifying and assessing potential threats right from the beginning of a project.

Step 1: Identify Assets: Customer data, databases, API keys, source code.

Step 2: Draw Data Flow Diagrams: Illustrate how data moves through the system.

Step 3: List Threats: Use the STRIDE framework (Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, Elevation of Privilege) for a comprehensive view.

Step 4: Assess Risks: For each threat, evaluate the Impact and Likelihood to prioritize handling.

Step 5: Plan Mitigation: For example, the “Spoofing” threat is mitigated by strong authentication (MFA).

7. Secure Development Lifecycle (SDL) — Secure Software Development Lifecycle

This is a framework for integrating security into each phase of the software lifecycle.

Phase 1: Planning & Design

“Security by Design”: Security must be a non-functional requirement from the start. Perform Threat Modeling to understand risks.

Apply secure design principles: “Principle of Least Privilege” (each component has only the minimum necessary permissions), “Defense in Depth” (multi-layered defense).

Phase 2: Implementation

Secure Coding: Follow secure coding rules, use verified libraries.

Automated Checks: Integrate SAST (Static Analysis) and SCA (Software Composition Analysis) tools into the pipeline to automatically scan for code errors and dependency vulnerabilities.

Phase 3: Testing

Security Testing: Combine multiple testing forms: DAST (Dynamic Analysis) like OWASP ZAP to scan running applications, manual Penetration Testing, and permission testing.

QA & Security Collaboration: QA and Security teams (if available) work closely to write test scenarios for attack situations.

Phase 4: Deployment

Secure Pipeline: Ensure CI/CD pipeline is secured (secret management, approval steps).

Secure Infrastructure: Configure infrastructure (cloud, containers) in a hardened manner. Scan container images before deployment. Apply RBAC for Kubernetes and cloud services.

Phase 5: Maintenance & Operation

Continuous Monitoring: Use SIEM (Security Information and Event Management) systems to monitor and detect anomalies in real-time.

Vulnerability Management: Continuously update patches for OS, frameworks, and libraries. Have a process for quickly handling new vulnerability reports (CVEs).

8. Useful Tips to Apply Immediately

9. Other Important Notes to Remember

Session and Token Management:

API Security:

Data Protection:

Environment and Configuration Separation:

Incident Response:

People Are the Key Factor:

10. AI-assisted Coding — Security Considerations When Developing Software with AI

With the popularity of AI-assisted coding like GitHub Copilot, ChatGPT, Tabnine, or Codeium, using AI for code suggestions increases productivity but also carries unique security risks. Here are important considerations:

Carefully Review AI-Suggested Code

AI can generate insecure code or code containing vulnerabilities (SQL Injection, XSS, hardcoded secrets).

Never copy-paste AI-suggested code directly into production repositories. Every line of code must be reviewed as carefully as developer-written code.

Don’t Expose Sensitive Information

Avoid pasting credentials, API keys, tokens, or sensitive data into public AI (like ChatGPT free).

When needing to use AI with internal data, prioritize local AI or enterprise AI with security mechanisms that don’t store data externally.

Audit AI-Generated Code

All AI-generated code must be scanned with SAST, dependency scanning, and secret scanning before merging.

Especially check code related to input/output, logging, authentication, and permissions.

Establish AI Usage Policies

Clear regulations: what types of data can be used with AI, how to check suggested code.

Limit repo or production access from AI tools.

Train developers to recognize prompt injection and risks of AI revealing internal information.

Integrate into CI/CD Pipeline

If using AI to auto-generate code or tests, ensure the pipeline checks security with automatic scanning steps.

Maintain audit trails to trace the origin of AI-generated code if needed.

By applying these principles, you can leverage AI to accelerate development while ensuring a high level of safety and security for your project.

11. Conclusion

Security is a continuous journey, not a destination. It cannot be “added” at the end of a project but must be “woven” into every thread of the development process.

Only when all these pieces work together will your software product be truly sustainable and trustworthy against increasingly sophisticated threats.

“Security isn’t something you build once. It’s something you maintain every single day.”


Share this post on:

Previous Post
Kafka: Lessons Only Production Can Teach You
Next Post
High-Load System Design: Comprehensive Solutions from Front-end to Back-end