[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Универсальная защита от xss-атак и sql-инъекций
Страницы: 1, 2
waldicom
Цитата (SorokinFilipp265 @ 19.07.2019 - 07:44)
в моём понимании инъекция - это либо инсулин, либо наркотики, поэтому этот термин лучше не использовать в программировании

Это очень хорошее решение! В вашем случае лучше вообще программирование не использовать.


_____________
Свои мозги еще никто не отменял.
Телепатов нету.
SiteMaster
Цитата (SorokinFilipp265 @ 19.07.2019 - 10:44)
Цитата (SiteMaster @ 18.07.2019 - 16:10)
Если вам нужна инъекция вы можете заказать ее

в моём понимании инъекция - это либо инсулин, либо наркотики, поэтому этот термин лучше не использовать в программировании

А в общем понимании, инъекция - это внедрение.
В том числе и внедрение постороннего программного кода (в программировании).
Каким термином назвать то или иное явление/процесс/предмет решает тот, кто впервые его описал.
Может вы еще и Америку захотите переименовать?)
killer8080
Цитата (SorokinFilipp265 @ 19.07.2019 - 09:51)
я ответа не получил, не указана структура бд, не приведён пример данных в бд, не указано значение переменной $_GET[page]

показана возможность провести инъекцию из-за бездумного применения эскейпинга, причем тут структура таблиц и данные в бд?

Цитата (SorokinFilipp265 @ 19.07.2019 - 09:51)
не указано значение переменной $_GET[page]

в этой переменной ожидается число, а прилететь может что угодно, включая и sql запрос который будет выполнен сервером. Примеры эксплуатации SQLi легко гуглятся wink.gif
Guest
Цитата (SorokinFilipp265 @ 18.07.2019 - 15:26)
для работы с бд можно использовать вспомогательный php скрипт

<?php
// mysql класс для работы с бд

define("MHOST", "localhost"); // адрес mysql сервера, обычно localhost
define("MUSER", "root"); // имя пользователя базы данных
define("MPASS", "parol"); // пароль пользователя базы данных
define("MDBNM", "baza"); // имя базы данных mysql

class DBi {
public static $conn;
public static function get($args) {
return self::$conn->$args;
}
public static function __callStatic($func, $args) {
if(is_null(self::$conn)){
self::$conn = new mysqli(MHOST, MUSER, MPASS, MDBNM); // сервер логин пароль база данных
if (self::$conn->connect_error) {
die('Connect Error (' . self::$conn->connect_errno . ') '. self::$conn->connect_error);
}
DBi::set_charset("utf8");
}
return call_user_func_array(array(self::$conn, $func), $args);
}
}

// простой запрос в БД
function mq($sql) {
$res = DBi::query($sql);
if (!is_bool($res)) $res->free();
}
// вставить ряд в БД
function mi($sql) {
$res = DBi::query($sql);
$id = 0;
if ($res===true) $id = DBi::get("insert_id");
if (!is_bool($res)) $res->free();
return $id;
}
// получаем линию в БД
function mr($sql) {
$res = DBi::query($sql);
$row = false;
if (!is_bool($res) AND $res->num_rows>0)
$row = $res->fetch_assoc();
if (!is_bool($res)) $res->free();
return $row;
}
// изменить ряд или несколько рядов в БД
function mu($sql) {
$res = DBi::query($sql);
$id = 0;
if ($res===true) $id = DBi::get("affected_rows");
if (!is_bool($res)) $res->free();
return $id;
}
// получаем поле из БД
function mf($sql,$field) {
$res = DBi::query($sql);
$row = false;
if (!is_bool($res) AND $res->num_rows>0)
$row = $res->fetch_assoc();
if (!is_bool($res)) $res->free();
if (isset($row[$field])) return $row[$field];
return false;
}
// получаем массив-таблицу из БД
function ma($sql) {
$res = DBi::query($sql);
$rows = array();
if (!is_bool($res) AND $res->num_rows>0) {
while ($row = $res->fetch_assoc()) $rows[] = $row;
}
if (!is_bool($res)) $res->free();
return $rows;
}
// получаем массив первого столбца таблицы из БД
function maf($sql) {
$res = DBi::query($sql);
$rows = array();
if (!is_bool($res) AND $res->num_rows>0) {
if ($row = $res->fetch_assoc()) { $kr = key($row); $rows[] = $row[$kr]; }
while ($row = $res->fetch_assoc()) $rows[] = $row[$kr];
}
if (!is_bool($res)) $res->free();
return $rows;
}
// получаем массив соответствия первого столбца второму в таблице БД
function mas($sql) {
$res = DBi::query($sql);
$rows = array();
if (!is_bool($res) AND $res->num_rows>0) {
if ($row = $res->fetch_assoc()) { $k = key($row); next($row); $v=key($row); $rows[$row[$k]] = $row[$v]; }
while ($row = $res->fetch_assoc()) $rows[$row[$k]] = $row[$v];
}
if (!is_bool($res)) $res->free();
return $rows;
}
// простое экранирование строки
function sqle($v) {
return "".DBi::real_escape_string($v)."";
}
// сложное экранирование
function sqlse($v) {
if (is_array($v)) {
$b = "".sqle($v[1])."";
switch ($v[0]) {
case 'l': $b = "'%".$b."%'"; break; // like
case 'll': $b = "'".$b."%'"; break; // likeleft
case 'lr': $b = "'%".$b."'"; break; // likeright
}
$b = ' LIKE '.$b;
} else {
if (is_null($v)) $b = 'NULL';
elseif ($v === "NOW()") $b = 'NOW()';
else $b = "'".sqle($v)."'";
$b = ' = '.$b;
}
return $b;
}
// склеивание аргументов в SET SQL
function sqlset($arr) {
$out = array();
foreach ($arr as $k=>$v) {
$b = sqlse($v);
$k2 = explode('.',$k); $k1 = array_pop($k2); $k2[] = '`'.$k1.'`';
$out[] = implode('.',$k2).''.$b;
}
$out = implode(', ',$out);
if ($out=='') return '';
return ' SET '.$out;
}
// склеивание аргументов в WHERE SQL
function sqlwhere($arr) {
$out = array();
foreach ($arr as $k=>$v) {
$b = sqlse($v);
$k2 = explode('.',$k); $k1 = array_pop($k2); $k2[] = '`'.$k1.'`';
$out[] = implode('.',$k2).''.$b;
}
$out = implode(' AND ',$out);
if ($out=='') return '';
return ' WHERE '.$out;
}


пример использования

<?php
require 'db.php';
$sql = "SELECT user, parol FROM users"
// получает из бд одну строку (массив вида array("user"=>"a", "parol"=>"b"))
$row = mr($sql);

а я сделал проще
кодирую все опасные символы в base64 перед отправкой в БД и при извлечении декодирую их и вывожу htmlspecialshars
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.