# Практика 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(); } } } ```