mysql_escape_string и уязвимость
[html]
<form method="post">
<input type="text" name="login" /><br />
<input type="password" name="password" /><br />
<input type="submit />
</form>
[/html]
Код:
$login = mysql_escape_string( trim($_POST['login']) );
$password = mysql_escape_string(trim($_POST['password']) );
$query = "SELECT id FROM admins WHERE login='$login' AND DECODE(password, 'blabla')='$password'";
$rs = mysql_query($query);
if (@mysql_num_rows($rs) == 1){
//....signed...
}
$password = mysql_escape_string(trim($_POST['password']) );
$query = "SELECT id FROM admins WHERE login='$login' AND DECODE(password, 'blabla')='$password'";
$rs = mysql_query($query);
if (@mysql_num_rows($rs) == 1){
//....signed...
}
Известно, что mysql_escape_string также экранирует символы кавычек, так что строка типа
Цитата:
bla' or 1=1;//
не пройдет в данном случае:
Цитата:
SELECT id FROM admins WHERE login=[COLOR=red]'bla\'[/COLOR] or 1=1 //' AND DECODE(password, 'blabla')='sdfa'
Видно, что мускул реагирует на обратный слэш и экранирует вторую кавычку, которая впоследствии принимается за простой символ, в последствии возникает ошибка при введенном варианте.
Можно ли доверять вышеприведенному коду?
И хотелось бы посоветовать избавиться от проверки пароля прямо в запросе, просто если каким либо образом инъекция осуществится и конструкция or 1=1 // сработает, то мы получим доступ к ....signed... секции, а если пассворд проверяется отделно, то это уже непройдет
Спасибо за ответ, но хотелось бы узнать конкретно по данному коду.
между кавычками будет восприниматься как одна строка типа [COLOR=#ff0000]'bla\'[/COLOR] or 1=1 //' и БД будет искть такой логин - уязвимости в конкретном примере нет - единственная трабла нагрузка на БД при последовательном переборе или поиске по индексу несуществуемой заведомо записи
Спасибо, но это не есть большая проблема. :)
Цитата: SkyM@n
Спасибо, но это не есть большая проблема. :)
а хде плюсик :)) ?
Цитата: Fenyx
а хде плюсик :)) ?
Какой? Там не должно быть плюсов.
Цитата: SkyM@n
Какой? Там не должно быть плюсов.
проехали :) я не про плюсик в коде :)