avatar_Everybody

Защита от Php-inj и Sql-inj в Web мастеру, PHP, AJAX, MySQL

Автор Everybody, 2008 Дек. 13, 16:40

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Ключевые слова [SEO] phpmysqlзащита от sql-injзащита от php-inj

Everybody

Защита от PHP-inj и SQL-inj
Полезная мелочь в скрипте.

<? ...
$_GET['уязвимое_поле'] = htmlspecialchars($_GET['уязвимое_поле']);
... ?>

PHP-inj PHP код:
<?  error_reporting(0);
function inc($do,$inc,$posle)   {      $inc = htmlspecialchars($inc);
if(file($do.$inc.$posle))      {    $inc = str_replace('http','',$inc);
$inc = str_replace('ftp','',$inc);
$inc = str_replace(':','',$inc);
$inc = str_replace('/','',$inc);
$inc = str_replace('\','',$inc);
$inc = str_replace('.','',$inc);
include($do.$inc.$posle);      }
else echo 'Файла не существует';  }
if($_GET['page']) inc('',$_GET['page'],'.php');  ...   ?>

SQL-inj:PHP код:<? ...  function secure_sql($value)
{
if( get_magic_quotes_gpc() )
{
$value = stripslashes( $value );
}
if( function_exists( "mysql_real_escape_string" ) )
{
$value = mysql_real_escape_string( $value );
}
else
{
$value = addslashes( $value );
}
return $value;
} ... ?>

Everybody

Анти SQL inject

mysql_real_escape_string - Экранирует специальные символы в unescaped_string, принимая во внимание кодировку соединения, таким образом, что результат можно безопасно использовать в SQL-запросе в функци mysql_query(). Если вставляются бинарные данные, то к ним так же необходимо применять эту функцию.

mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: x00, n, r, , ', " and x1a.

Эта функция должна всегда (за несколькими исключениями) использоваться для того, чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.

Пример #1 Простой пример использования mysql_real_escape_string()
<?php
// Connect
$link mysql_connect('mysql_host''mysql_user''mysql_password')
OR die(
mysql_error());

// Query
$query sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>

Пример #2 Пример взлома с использованием SQL Injection
<?php
// посылаем запрос, чтобы проверить имя и пароль пользователя
$query "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// Мы не никак проверили переменную $_POST['password'],
// а она может содержать совсем не то, что мы ожидали. Например:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// посмотрим, какой запрос будет отправлен в MySQL:
echo $query;
?>
Запрос, который будет отправлен в MySQL:
SELECT * FROM users WHERE name='aidan' AND password='' OR ''=''
Это позволит кому угодно войти в систему без пароля.


Пример #3 Лучший вариант составления запроса
Применение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes.
<?php
// Функция экранирования переменных
function quote_smart($value)
{
// если magic_quotes_gpc включена - используем stripslashes
if (get_magic_quotes_gpc()) {
$value stripslashes($value);
}
// Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем
if (!is_numeric($value)) {
$value "'" mysql_real_escape_string($value) . "'";
}
return 
$value;
}

// Соединяемся
$link mysql_connect('mysql_host''mysql_user''mysql_password')
OR die(
mysql_error());

// Составляем безопасный запрос
$query sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
quote_smart($_POST['username']),
quote_smart($_POST['password']));

mysql_query($query);
?>
Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.

Источник: _https://lv.php.net/mysql_real_escape_string

Похожие темы (5)