|
|
|
| Данный пример многим уже известен. Задача состоит в том, чтобы вывести паролья ползователя ( похищение данных ). А втарая часть задания состоит в преобразовании, которое исключило бы от взлома при помощи sql - иньекции.
<?php
// Устанавливаем соединение с базой данных
require_once("config.php");
// Запрашиваем список всех пользователей
$query = "SELECT * FROM userslist WHERE id_user = $_GET[id_user]";
$usr = mysql_query($query);
if(!$usr) exit("Ошибка - ".mysql_error());
$user = mysql_fetch_array($usr);
echo "Имя пользователя - $user[name]<br>";
if(!empty($user['email'])) echo "e-mail - $user[email]<br>";
if(!empty($user['url'])) echo "URL - $user[url]<br>";
?>
|
Так вот, было привидено много примеро как предотвратить sql - иньекция. Но почему то я не нашел не одного вариатна, где можно было бы, модернизировать данный скрипт с помощью функции addslashes
В моем примере я обрамляю сам параметр кавычками и кавычки в запросе мнемонизирую братным слэшем.
Вот мой пример модернизации
<?php
// Устанавливаем соединение с базой данных
require_once("config.php");
// Мнемонизируем обратным слешем
$_GET['id_user'] = addslashes( $_GET['id_user'] );
// Запрашиваем список и параметр обрамляем кавычками '$_GET[id_user]'
$query = "SELECT * FROM userslist WHERE id_user = '$_GET[id_user]'";
$usr = mysql_query( $query );
if ( $user = mysql_fetch_array( $usr ) ) {
echo "Имя пользователя - $user[name]<br>";
if( !empty( $user['email'] ) ) echo "e-mail - $user[email]<br>";
if( !empty( $user['url'] ) ) echo "URL - $user[url]<br>";
}
else {
exit( "Ошибка!" );
}
?>
|
Вот таки образом бы выглядел запрос к бд.
"SELECT * FROM userslist
WHERE id_user = '-1 UNION SELECT 1,pass,2,3,4 FROM userslist WHERE id_user=$_GET[id_user]' "
|
Данное поведение является прямым следствием факта, что в случае мнемонизации кавычек в значении некорой переменной ( в нашем случае id_user = '$_GET[id_user]' ) она не быдует содержать немнемонизированную кавычку, а следовательно, и выбраться в этой переменной за пределы строки не получится.
В этом примере уязвимость sql - иньекции отсутствует. | |
|
|
|
|
|
|
|
для: kingarturbig
(07.01.2007 в 19:35)
| | В данном случае более логичным является не обработка, а проверка входных данных. | |
|
|
|
|
|
|
|
для: kingarturbig
(07.01.2007 в 19:35)
| | Если в айдишнике пользователя передаёться числовой параметр, то можна использовать такой код
$_GET['id_user'] = (int) $_GET['id_user'];
|
он сделает невозможным ввод любых данных кроме цыфр | |
|
|
|