Небольшая справка по безопасностиАвтор: М. Дроздовский Собственно, это статья о трех небольших проблемах в безопасности подавляющего
числа "самодельных" скриптов.
1. Возможность SQL-injection. Внимательно изучите этот кусок
кода (PHP):
$conn = mysql_connect("localhost", "zz", "zz")
mysql_select_db("test", $conn)
$sql = "SELECT adminpwd FROM data WHERE login=\'$login\' ";
$a = mysql_query($sql, $conn)
$z = mysql_result($a, 1)
...
Допустим, скрипт называется script.php и параметр login передается ему в виде
script.php?login=ssss . Вы видите, что параметр login никак не проверяется.
А что будет, если вместо login=admin передать login=\'admin ? Будет ошибка SQL-запроса,
ведь к базе данных передается запрос SELECT adminpwd FROM data WHERE login=\'\'admin\'
.
В такой ситуации злоумышленник может исполнить любой SQL-запрос (использовав,
например union).
Защита от этого предельно проста: использовать функцию mysql_escape_string($string)
2. Возможность исполнения произвольной команды. Необходимо
всегда проверять включаемые файлы, особенно не рекомендуется использовать include($inc),
если переменная $inc передается через адресную строку.
3. Возможность переопределения переменных. Возьмем такой пример:
$file=file("zz.txt")
$cc=count($file)
$c = 0;
while($c < $cc) {
$f .= $file[$c++];
}
...
?>
Допустим, что $f в конце цикла содержит какую-нибудь важную информацию из файла.
Или, что еще хуже, она исполняется командой cmd($f)
Так как переменная $f не определена в начале скрипта (должно быть $f="";),
то ее начальное значение может определить пользователь (введя в адресной строке
что-нибудь вроде script.php?f=ddddd).
В зависимости от важности переменной $f будет варьироваться вред, который сможет
причинить злоумышленник. Если, конечно, он угадает название переменной и ее
значение.
|