# Практика 2. Разработка безопасного программного обеспечения
###### tags: `Разработка безопасного программного обеспечения` `РБПО` `МИРЭА` `MIREA` `Оценка кода` `код ревью` `code review`
author: @0x41
reviewed: 2020-10-20
## Оценка и анализ кода (код ревью) для обеспечения безопасности программного обеспечения
### Литература
1. [Что такое код-ревью и кто им занимается? //Yandex](https://academy.yandex.ru/posts/chto-takoe-kod-revyu-i-kto-im-zanimaetsya)
2. [https://tproger.ru/translations/code-review-a-la-google //Tproger](https://tproger.ru/translations/code-review-a-la-google/)
3. [Code review по-человечески (часть 1) //Хабр](https://habr.com/ru/post/340550/)
4. [Code review по-человечески (часть 2) //Хабр](https://habr.com/ru/post/342244/)
5. [Code Review — Полное руководство //Medium@Саша Азарова](https://medium.com/nuances-of-programming/code-review-полное-руководство-5e5341f670)
### Пример
``` C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SQLite;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SQLInjections
{
public partial class Form1 : Form
{
private string dbFileName = "DBSqlLite";
private string dbTableName = "TestTable";
private SQLiteConnection m_dbConn;
private SQLiteCommand m_sqlCmd;
public Form1()
{
InitializeComponent();
m_dbConn = new SQLiteConnection();
m_sqlCmd = new SQLiteCommand();
dbFileName = "DBSqlLite";
OpenDB();
CreateDBAndTable();
}
/// Проблема: Беспарольное (незащищенное) подключение к БД
///
/// CWE: 862, 952
///
/// Источники: https://stackoverrun.com/ru/q/259901
/// https://github.com/PositiveTechnologies/PT.Doc/blob/master/CWE-List/CWE-List.md
///
/// Предлагаемое исправление: установить пароль методом conn.SetPassword($"{пароль}")
private void OpenDB()
{
if (!File.Exists(dbFileName))
SQLiteConnection.CreateFile(dbFileName);
try
{
m_dbConn = new SQLiteConnection("Data Source=" + dbFileName + ";Version=3;");
m_dbConn.Open();
m_sqlCmd.Connection = m_dbConn;
}
catch (SQLiteException ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
private void CreateDBAndTable()
{
try
{
m_sqlCmd.CommandText = "CREATE TABLE IF NOT EXISTS "+ dbTableName + " (id INTEGER PRIMARY KEY AUTOINCREMENT, FirstName TEXT, SecondName TEXT, LastName TEXT)";
m_sqlCmd.ExecuteNonQuery();
}
catch (SQLiteException ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
private void DropTable()
{
try
{
m_sqlCmd.CommandText = "DELETE from " + dbTableName;
m_sqlCmd.ExecuteNonQuery();
}
catch (SQLiteException ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
private void AddData()
{
Random rand = new Random();
string word = "";
int n = 3;
for (int i = 0; i < n; i++)
{
word = Guid.NewGuid().ToString();
m_sqlCmd.CommandText = "INSERT INTO "+ dbTableName + " ('FirstName', 'SecondName','LastName') values ('"
+ word.Substring(0, rand.Next(1, 15)) + "' , '"
+ word.Substring(0, rand.Next(1, 15)) + "' , '"
+ word.Substring(0, rand.Next(1, 15)) + "')";
m_sqlCmd.ExecuteNonQuery();
}
}
/// Проблема: Невалидированный ввод, при вводе в текстовое поле слова "id",
///
/// Будет составлен запрос "Select * from TestTable where id=id",
/// Который вернет все записи в таблице
///
/// CWE : 253
///
/// Источники: https://rzelenov.livejournal.com/481.html
/// https://github.com/PositiveTechnologies/PT.Doc/blob/master/CWE-List/CWE-List.md
///
/// Предлагаемое исправление:
/// if (!System.Text.RegularExpressions.Regex.IsMatch(textBoxId.Text, @"^\d+$"))
/// {
/// MessageBox.Show($"Error: {textBoxId.Text} is not valid id value.");
/// return;
/// }
private void GetData()
{
DataTable dTable = new DataTable();
String sqlQuery;
sqlQuery = "Select * from " + dbTableName + " where id= " + textBoxId.Text;
try
{
SQLiteDataAdapter adapter = new SQLiteDataAdapter(sqlQuery, m_dbConn);
adapter.Fill(dTable);
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
for (int i = 0; i < dTable.Columns.Count; i++)
dataGridView1.Columns.Add(i.ToString(), i.ToString());
for (int i = 0; i < dTable.Rows.Count; i++)
dataGridView1.Rows.Add(dTable.Rows[i].ItemArray);
}
catch (SQLiteException ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
private void button1_Click(object sender, EventArgs e)
{
GetData();
}
private void button2_Click(object sender, EventArgs e)
{
AddData();
}
private void button3_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
dataGridView1.Columns.Clear();
}
private void button4_Click(object sender, EventArgs e)
{
DropTable();
}
}
}
```