19 смертных грехов, угрожающих безопасности программ. Майкл Ховард

Читать онлайн книгу.

19 смертных грехов, угрожающих безопасности программ - Майкл Ховард


Скачать книгу
"Результата нет!";

      } else {

      echo $result;

      }

      else {

      echo "Неверный ID. Попробуйте еще раз.");

      }

      ?>

      Версии PHP ниже 5.0 не поддерживают связывания параметров с помощью показанной выше функции mysqli_prepare. Однако если для работы с базами данных вы пользуетесь архивом расширений PHP PEAR (PHP Extensions and Applications Repository, http://pear.php.net), то там есть функции DB_common::prepare() и DB_common::query() для подготовки параметризованных запросов.

      Искупление греха в Perl/CGI

      #!/usr/bin/perl

      use DBI;

      use CGI;

      print CGI::header();

      $cgi = new CGI;

      $id = $cgi->param('id');

      // пропускаем только корректные ID (от 1 до 8 цифр)

      exit unless ($id =~ /^[\d]{1,8}$);

      print "<html><body>";

      // Параметры соединения получаем извне

      $dbh = DBI->connect(conn(),

                                conn_name(),

                                conn_pwd())

      or print "Ошибка connect";

                                # детальная информация об ошибке в $DBI::errstr

      $sql = "SELECT ccnum FROM cust WHERE id = ?";

      $sth = $dbh->prepare($sql)

      or print "Ошибка prepare";

      $sth->bind_param(1,$id);

      $sth->execute()

      or print "Ошибка execute";

      # Вывести данные

      while (@row = $sth->fetchrow_array ) {

      print "@row<br>";

      }

      $dbh->disconnect;

      print "</body></html>";

      exit;

      Искупление греха в Java с использованием JDBC

      public static boolean doQuery(String Id) {

      // пропускаем только корректные ID (от 1 до 8 цифр)

      Pattern p = Pattern.compile("^\\d{1,8}$");

      if (!p.matcher(arg).find())

      return false;

      Connection con = null;

      try

      {

      Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

      con = DriverManager.getConnection("jdbc:microsoft:sqlserver: " +

                                                    "//localhost:1433", "sa", "$3cre+");

      PreparedStatement st = con.prepareStatement(

      "exec pubs..sp_GetCreditCard ?");

      st.setString(1, arg);

      ResultSet rs = st.executeQuery();

      while (rx.next()) {

         // Получить данные из rs.getString(1)

      }

      rs.close();

      st.close();

      }

      catch (SQLException e)

      {

      System.out.println("Ошибка SQL");

      return false;

      }

      catch (ClassNotFoundException e)

      {

      System.out.println("Ошибка во время исполнения");

      return false;

      }

      finally

      {

      try

      {

      con.close();

      } catch(SQLException e) {}

      }

      return true;

      }

      Искупление греха в ColdFusion

      При работе с ColdFusion используйте cfqueryparam в теге <cfquery>, чтобы обезопасить запрос с параметрами.

      Искупление греха в SQL

      Не следует исполнять в хранимой процедуре строку, полученную из не заслуживающего доверия источника, как процедуру. В качестве одного из механизмов глубоко эшелонированной обороны можно воспользоваться некоторыми функциями для проверки корректности строкового параметра. В примере ниже проверяется, что входной параметр содержит ровно четыре цифры. Заметим, что длина параметра заметно уменьшена, чтобы усложнить передачу любой другой входной информации.

      CREATE PROCEDURE dbo.doQuery(@id nchar(4))

      AS

      DECLARE @query nchar(64)

      IF RTRIM(@id) LIKE '[0-9][0-9][0-9][0-9]'

      BEGIN

      SELECT @query = 'select ccnum from cust where id = ''' + @id + ''''

      EXEC @query

      END

      RETURN

      Или еще лучше – потребуйте, чтобы параметр был целым числом:

      CREATE PROCEDURE dbo.doQuery(@id smallint)

      В Oracle lOg, как и в Microsoft SQL Server 2005, добавлены совместимые со стандартом POSIX регулярные выражения.


Скачать книгу