(binding). В примерах ниже продемонстрированы некоторые из таких безопасных конструкций.


Примечание. Во всех примерах информация о параметрах соединения не хранится в тексте программы; мы вызываем специальные функции, которые считывают данные из пространства приложения.

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

public string Query(string Id) {

string ccnum;

string sqlstring = "";

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

Regex r = new Regex(@"^\d{1,8}$");

if (!r.Match(Id).Success)

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

try {

SqlConnection sqlConn = new SqlConnection(GetConnection);

string str = "sp_GetCreditCard";

cmd = new SqlCommand(str, sqlConn);

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@ID", Id);

cmd.Connection.Open();

SqlDataReader read = myCommand.ExecuteReader();

ccnum = read.GetString(0);

}

catch (SqlException se) {

throw new Exception("Ошибка – попробуйте еще раз.");

}

}

Искупление греха в PHP 5.0 и MySQL версии 4.1 и старше

$db = mysqli_connect(getServer(), getUid(), getPwd());

$stmt = mysqli_prepare($link, "SELECT ccnum FROM cust WHERE id=?");

$id = $HTTP_GET_VARS["id"];

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

if (preg_match('\d{1,8}$/',$id);

mysqli_stmt_bind_param($stmt, "s", $id);

mysqli_stmt_execute($stmt);

mysqli_stmt_bind_result($stmt, $result);

mysqli_stmt_fetch($stmt);

if (empty($name)) {

echo "Результата нет!";

} 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 "";

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

$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
";

}

$dbh->disconnect;

print "";


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