<p><strong>Meta Description:</strong> Aprenda security testing: OWASP Top 10, SAST, DAST, penet testers manuais, como integrar segurança ao pipeline de QA.</p>

<hr>
<h2>Tipos de Security Testing</h2>

<figure class="wp-block-table"><table>
<tr><th>Tipo</th><th>Descrição</th><th>Automação</th></tr>
<tr><td><strong>SAST</strong></td><td>Análise estática de código</td><td>✅ Alta</td></tr>
<tr><td><strong>DAST</strong></td><td>Teste dinâmico de aplicação</td><td>✅ Alta</td></tr>
<tr><td><strong>SCA</strong></td><td>Análise de composição de software</td><td>✅ Alta</td></tr>
<tr><td><strong>IAST</strong></td><td>Teste interativo</td><td>⚠️ Média</td></tr>
<tr><td><strong>Pentest</strong></td><td>Teste manual de penetração</td><td>❌ Baixa</td></tr>
</table></figure>

<hr>
<h2>OWASP Top 10 (2021)</h2>

<h3>A01 - Broken Access Control</h3>

<pre><code># VULNERÁVEL
@app.route('/pedido/')
def get_pedido(id):
    # Não verifica ownership!
    return Pedido.query.get(id)

<p># SEGURO<br>@app.route('/pedido/')<br>@login_required<br>def get_pedido(id):<br>    pedido = Pedido.query.filter_by(<br>        id=id, <br>        usuario_id=current_user.id<br>    ).first_or_404()<br>    return pedido<br></code></pre></p>

<h3>A02 - Cryptographic Failures</h3>

<pre><code># VULNERÁVEL
senha = "senha123"  # Texto puro!

<p># SEGURO<br>from cryptography.fernet import Fernet</p>

<p>key = Fernet.generate_key()  # Armazenar em vault!<br>cipher = Fernet(key)<br>senha_hash = bcrypt.hashpw(senha.encode(), bcrypt.gensalt())<br></code></pre></p>

<h3>A03 - Injection</h3>

<pre><code>-- VULNERÁVEL (SQL Injection)
query = f"SELECT * FROM users WHERE email = '{email}'"

<p>-- SEGURO (Parameterized)<br>cursor.execute("SELECT * FROM users WHERE email = {6727d158e4474b0847515bd23a8ee4bebd5f1aac7a18bc968e51d8985dccb442}s", (email,))<br></code></pre></p>

<hr>
<h2>SAST - Static Application Security Testing</h2>

<h3>SonarQube</h3>

<pre><code># GitHub Actions
<ul><li>name: SonarCloud Scan</li>
  uses: SonarSource/sonarcloud-github-action@master
  env:
    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

<p># sonar-project.properties<br>sonar.projectKey=myproject<br>sonar.sources=src<br>sonar.tests=tests<br>sonar.python.coverage.reportPaths=coverage.xml<br>sonar.security Risks=high,critical<br></code></pre></p>

<h3>Semgrep</h3>

<pre><code># Install
pip install semgrep

<p># Run<br>semgrep --config=auto .</p>

<p># Custom rule<br>rules:<br>  - id: hardcoded-secret<br>    pattern: $SECRET = "$VALUE"<br>    message: Hardcoded secret found<br>    severity: ERROR<br>    languages: [python]<br></code></pre></p>

<hr>
<h2>DAST - Dynamic Application Security Testing</h2>

<h3>OWASP ZAP</h3>

<pre><code># CLI scan
docker run -t owasp/zap2docker-stable 
  zap-baseline.py 
  -t https://example.com 
  -J zap-report.json

<p># GitHub Actions<ol><li>name: OWASP ZAP Scan</li><br></ol>  uses: zaproxy/action-baseline@v0.9.0<br>  with:<br>    target: 'https://staging.example.com'<br>    rules_rules_name: 'api-scan'<br></code></pre></p>

<hr>
<h2>SCA - Software Composition Analysis</h2>

<h3>Snyk</h3>

<pre><code># Install
npm install -g snyk

<p># Test<br>snyk test</p>

<p># Monitor<br>snyk monitor</p>

<p># GitHub Action<ol><li>name: Snyk Security Scan</li></ol></ul><br>  uses: snyk/actions/node@master<br>  env:<br>    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}<br></code></pre></p>

<hr>
<h2>Conclusão</h2>

<p>Security testing deve ser integrado ao pipeline. As chaves são:<br><ol><li><strong>Automação</strong> - SAST, DAST, SCA no CI/CD</li><br><li><strong>OWASP</strong> - Conheça as vulnerabilidades principais</li><br><li><strong>Pentests</strong> - Regular, para complementar automação</li><br><li><strong>Remediação</strong> - Não é só detectar, é corrigir</li><br><li><strong>Cultura</strong> - Segurança é responsabilidade de todos</li></ol></p>