Регулярные выражения и Sql инъекции

  • Автор темы Satell
  • Дата начала
S

Satell

#1
1)
$arr = array("Gaz","Gazeta","gazirovanniy","glazirovanniy","Gazenvagen","asdfgazasdfh");
$reg="/.?gaz.?/i";

for($i=0; $i<count($arr); $i++)
{
if (preg_match($reg, $arr[$i])) {
echo $arr[$i];
}
}

почему такое регулярное выражение $reg="/.?gaz.?/i"; выводит слова Gaz, Gazeta, Gazenvagen, asdfgazasdfh,
хотя должно выводить только Gaz?! ведь .? это 0 или 1 символ

2) как вставить точки перед знаками вопроса в такой строчке $reg="/?gaz?/i";
3)
какой sql инъекцией можно "пробить" такой код?
$login = $_REQUEST['login'];
$password = $_REQUEST['password'];
$res = mysql_query('SELECT id FROM users
WHERE login="'.$login.'" AND password="'.$password.'"');
list($user_id) = mysql_fetch_array($res);
session_start();
$_SESSION['authorized'] = isset($user_id);
 
?

????

#2
<P>3) как вариант в логин загнать [sql]; drop table users; select * from users where 1=1[/sql] при определенных обстоятельсвах может дропнуть таблицу пользователей.</P>
 
M

MajestiC

#3
Для: Satell
1. Потому что у тебя не поставлены определители начала и конца строки в регулярке.
2. Какие еще точки?
3. Ввести в поле пароля след строчку
" OR 1=1 OR "s"="
 
A

aka_Kail

#4
Вот рабочий код

$arr = array("Gaz","Gazeta","gazirovanniy","glazirovanniy","Gazenvagen","asdfgazasdfh");

$reg="/(^gaz$)/i";

for($i=0; $i<count($arr); $i++)
{
if (preg_match($reg, $arr[$i])) {
echo $arr[$i];
}
}

# Вывел только Gaz