|
|
|
| обязательно так
<?php
if (!get_magic_quotes_gpc())
{
$author = mysql_escape_string($author);
$pswrd = mysql_escape_string($pswrd);
}
?>
|
или так тоже будет работать корректно?
<?php
$author = mysql_escape_string($author);
$pswrd = mysql_escape_string($pswrd);
?>
|
| |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 02:21)
| |
<?php
if( get_magic_quotes_gpc() )
{
$author = stripslashes( $author );
}
$author = mysql_escape_string( $author );
?>
|
надеятся на магические кавычки нечего, особенно после вот этого -> PHP 5.2.7 has been removed from distribution :-) | |
|
|
|
|
|
|
|
для: Root
(27.12.2008 в 16:30)
| | Вот так безопасно?
<?php
if (!defined("DB")) die("Illegal File Access");
global $prefix, $db;
if ($_POST[sub]) {
$login = mysql_escape_string($_POST['UserLogin']);
$passw = mysql_escape_string($_POST['UserPassword']);
$passw = htmlspecialchars(stripslashes($passw));
$login = htmlspecialchars(stripslashes($login));
$passw = md5($passw);
$query = "SELECT * FROM ".$prefix."_users WHERE UserLogin = '{$login}' AND UserPassword = '{$passw}'";
$result = $db->sql_query($query);
$numrows = $db->sql_numrows($result);
$row = $db->sql_fetchrow($result);
if($numrows != 0){
$id_user = intval($row['Uid']);
$id_login = htmlspecialchars(stripslashes($row['UserLogin']));
$UserSkin = htmlspecialchars(stripslashes($row['UserTheme']));
$id_login2 = htmlspecialchars(stripslashes($row['UserName']));
$remote_addr = getenv('REMOTE_ADDR');
$db->sql_query("UPDATE ".$prefix."_users SET UserIP = '{$remote_addr}' WHERE Uid={$id_user}");
$_SESSION['UID'] = $id_user;
$_SESSION['User'] = $id_login;
$_SESSION['Skin'] = $UserSkin;
$_SESSION['NIK_NAME'] = $id_login2;
if($_POST['Act']){$Act = $_POST['Act'];}else{$Act = "Home";}
header ("Location: ?Act=$Act");
} else {
print "<table width=\"98%\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" bgcolor=\"red\"><tr><th><font color=\"red\"><b>ERROR</b></font></th></tr>
<tr><td class=\"bgcolor1\"><br/><div align=\"center\"><b>Password or login are incorrect.</b><br></div><br>
</td></tr></table>"; return;
}
}
?>
|
| |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 22:01)
| | обработка переменной $passw
<?php
...
$passw = mysql_escape_string($_POST['UserPassword']);
...
$passw = htmlspecialchars(stripslashes($passw));
...
$passw = md5($passw);
|
убила наповал.. | |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 22:01)
| | 1. Если включены magic_quotes, обрабатываем переменные функцией stripslashes().
2. Перед тем как заносить их в базу обрабатываем их mysql_escape_string().
3. htmlspecialchars() используем непосредственно перед выводом данных пользователю.
UPD.
if ($_POST[sub]) ??
$id_user = intval($row['Uid']); ?? Приводим инт к инту?
header ("Location: ?Act=$Act"); ?? Location куда?
Password or login are is incorrect. | |
|
|
|
|
|
|
|
для: Root
(27.12.2008 в 22:36)
| | Я правльно понял
<?php
if (!defined("DB")) die("Illegal File Access");
global $prefix, $db;
if ($_POST[sub]) { //нажата кнопка логин
if( get_magic_quotes_gpc() )
{
$passw = stripslashes($_POST['UserPassword']);
$login = stripslashes($_POST['UserLogin']);
}
$login = mysql_escape_string($login);
$passw = mysql_escape_string($passw);
$passw = md5($passw);
$query = "SELECT * FROM ".$prefix."_users WHERE UserLogin = '{$login}' AND UserPassword = '{$passw}'";
$result = $db->sql_query($query);
$numrows = $db->sql_numrows($result);
$row = $db->sql_fetchrow($result);
if($numrows != 0){
$id_user = $row['Uid'];
$id_login = htmlspecialchars($row['UserLogin']);
$UserSkin = htmlspecialchars($row['UserTheme']);
$id_login2 = htmlspecialchars($row['UserName']);
$remote_addr = getenv('REMOTE_ADDR');
$db->sql_query("UPDATE ".$prefix."_users SET UserIP = '{$remote_addr}' WHERE Uid={$id_user}");
$_SESSION['UID'] = $id_user;
$_SESSION['User'] = $id_login;
$_SESSION['Skin'] = $UserSkin;
$_SESSION['NIK_NAME'] = $id_login2;
if($_POST['Act']){$Act = $_POST['Act'];}else{$Act = "Home";} //переадресация на страницу откуда залогинились
header ("Location: ?Act=$Act");
} else {
print "<table width=\"98%\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" bgcolor=\"red\"><tr><th><font color=\"red\"><b>ERROR</b></font></th></tr>
<tr><td class=\"bgcolor1\"><br/><div align=\"center\"><b>Password or login is incorrect.</b><br></div><br>
</td></tr></table>"; return;
}
}
?>
|
| |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 23:06)
| | да, правильно.
P.S.
после md5 вряд ли в $passw какие-то инъекции останутся :-) | |
|
|
|
|
|
|
|
для: Root
(27.12.2008 в 23:22)
| | спасибо | |
|
|
|
|
|
|
|
для: Root
(27.12.2008 в 23:22)
| | чего правильно?
А если магические кавычки отключены, кто будет присваивать значения переменным $passw и $login ?
А насчет md5 - так искажение данных не после вызова md5 произойдет, а до него. | |
|
|
|
|
|
|
|
для: Trianon
(27.12.2008 в 23:53)
| | >чего правильно?
понял правильно, ну или почти..
>А если магические кавычки отключены, кто будет присваивать значения переменным $passw и $login ? ...
тут я не доглядел. | |
|
|
|
|
|
|
|
для: Trianon
(27.12.2008 в 23:53)
| | Я так понимаю надо так переписать
if( get_magic_quotes_gpc() )
{
$passw = stripslashes($_POST['UserPassword']);
$login = stripslashes($_POST['UserLogin']);
} else{
$login = mysql_escape_string($_POST['UserLogin']);
$passw = mysql_escape_string($_POST['UserPassword']);
}
$passw = md5($passw);
|
| |
|
|
|
|
|
|
|
для: gurza
(28.12.2008 в 00:37)
| | Бред.
mysql_escape_string вообще не имеет отношения к получению POST-данных.
точно также как get_magic_quotes_gpc и stripslashes не имеет отношения к mysql_query.
Это два разных, совершенно независимых шага.
И md5() по идее должен стоять ровнехонько между этими шагами. | |
|
|
|
|
|
|
|
для: Trianon
(28.12.2008 в 00:54)
| | тогда пожалуйста напишите как должно быть | |
|
|
|
|
|
|
|
для: gurza
(28.12.2008 в 01:14)
| |
<?php
if (!defined("DB")) die("Illegal File Access");
global $prefix, $db;
if ( isset( $_POST['sub'] ) ) //а не то, что у Вас там..
{
$login = isset( $_POST['UserLogin'] ) ? $_POST['UserLogin'] : '';
$passw = isset( $_POST['UserPassword'] ) ? $_POST['UserPassword'] : '';
//upd.
//Можно также проверить заполнены ли все поля.
if( get_magic_quotes_gpc() )
{
$passw = stripslashes( $passw );
$login = stripslashes( $login );
//а ещё можно пройтись по массивам
//$_GET, $_POST, $_COOKIE ..
//функцией и убрать все слеши.
}
$passw = md5($passw);
$query = "SELECT * FROM " . $prefix . "_users
WHERE UserLogin = '" . mysql_escape_string( $login ). "'
AND UserPassword = '" . mysql_escape_string( $passw ) . "'";
//1. Обработка $passw функцией mysql_escape_string в данном случае избыточная,
//но Вы должны запомнить, что все строки перед занесением в базу
//обрабатываются mysql_escape_string!
//2. В классе $db нет метода escape?
$result = $db->sql_query($query);
//$numrows = $db->sql_numrows($result);
//зачем переменную создавать?
//$row = $db->sql_fetchrow($result);
//а если $numrows == 0?
if( $db->sql_numrows($result) != 0 )
{
$row = $db->sql_fetchrow($result);
//$id_user = $row['Uid'];
//$id_login = htmlspecialchars( $row['UserLogin'] );
//$UserSkin = htmlspecialchars( $row['UserTheme'] );
//$id_login2 = htmlspecialchars( $row['UserName'] );
//
//Написал же выше когда нужна htmlspecialchars..
$remote_addr = getenv('REMOTE_ADDR');
//вопрос на засыпку:
//А Вы уверены что тут($remote_addr) кроме ip адреса ничего не будет?
//..что делать с $remote_addr думайте сами
$db->sql_query( "UPDATE " . $prefix . "_users
SET UserIP = '" . $remote_addr . "'
WHERE Uid= " . $row['Uid'] );
$_SESSION['UID'] = $row['Uid'];
$_SESSION['User'] = $row['UserLogin'];
$_SESSION['Skin'] = $row['UserTheme'];
$_SESSION['NIK_NAME'] = $row['UserName'];
$Act = isset( $_POST['Act'] ) ? $_POST['Act'] : "Home";
header ("Location: ?Act=$Act");
//куда Location???
}
else
{
?>
<table width="98%" border="0" cellspacing="1" cellpadding="3" bgcolor="red">
<tr><th><font color="red"><b>ERROR</b></font></th></tr>
<tr><td class="bgcolor1"><br/><div align="center">
<b>Password or login is incorrect.</b><br></div><br>
</td></tr></table>
<?php
return;//куда?
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Root
(28.12.2008 в 12:12)
| | Спасибо теперь понятненько | |
|
|
|
|
|
|
|
для: Root
(28.12.2008 в 12:12)
| | Автор: Root (28.12.2008 в 12:12)
что делать с $remote_addr думайте сами
решил прогнать ир через
$remote_addr = getenv('REMOTE_ADDR');
$ip = ip2long($remote_addr);
|
| |
|
|
|
|
|
|
|
для: gurza
(28.12.2008 в 16:30)
| | ip2long странная штука..
В мануале написано:
"Returns the IPv4 address or FALSE if ip_address is invalid." и пример
<?php
$ip = gethostbyname('www.example.com');
$long = ip2long($ip);
if ($long == -1 || $long === FALSE) {
echo 'Invalid IP, please try again';
} else {
echo $ip . "\n"; // 192.0.34.166
echo $long . "\n"; // -1073732954
printf("%u\n", ip2long($ip)); // 3221234342
}
?>
|
но не всё так просто..
<?php
for ($i=0; $i<=255; $i++)
{
$ip = '127.0.0.1' . chr($i). "sql injection";
$long = ip2long( $ip );
echo ($long == -1 || $long === FALSE) ?
'Invalid IP, please try again, IP - ' . $ip . '<br />' :
'Valid IP - ' . $ip . '<br />';
}
|
| |
|
|
|
|
|
|
|
для: Root
(28.12.2008 в 16:49)
| | Так что не стоит использовать функцию ip2long? | |
|
|
|
|
|
|
|
для: gurza
(28.12.2008 в 18:36)
| | если хотите её использовать, то проверяйте также длину строки. | |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 23:06)
| | $passw = mysql_escape_string($passw);
Зачем? Если вы дальше используете функцию хеширования? | |
|
|
|
|
|
|
|
для: AcidTrash
(27.12.2008 в 23:30)
| | Понял уже просто смотрел как пример слаед цмс :) | |
|
|
|
|
|
|
|
для: Root
(27.12.2008 в 16:30)
| | >надеятся на магические кавычки нечего, особенно после вот этого -> PHP 5.2.7 has been removed from distribution :-)
Дело не в надежде, а в том, что мы вынуждены в коде учитывать сервера, как с включеными магическими кавычками, так и с отключенными, и даже после отмены ситуация не изменится - сервера с включенными и отключенными магическими кавычками будут оставаться, а у нас в коде появится ещё один геморрой в виде
<?php
if(!function_exists('get_magic_quotes_gpc'))
{
function get_magic_quotes_gpc()
{
return false;
}
}
?>
| который будет учитывать сервера, где функции get_magic_quotes_gpc() нет. | |
|
|
|
|
|
|
|
для: cheops
(28.12.2008 в 15:42)
| | >у нас в коде появится ещё один геморрой в виде ...
геморрой уже есть. Вот мой :-) :
<?php
if( get_magic_quotes_gpc() )
{
$input = array( &$_GET, &$_POST, &$_COOKIE );
while( list( $k,$v ) = each( $input ) )
{
foreach( $v as $key => $val )
{
if( !is_array( $val ) )
{
$input[$k][$key] = stripslashes( $val );
continue;
}
$input[] =& $input[$k][$key];
}
}
unset( $input );
}
?>
|
а станет
<?php
if( phpversion() < '6.0.0' && get_magic_quotes_gpc() )
...
|
| |
|
|
|
|
|
|
|
для: cheops
(28.12.2008 в 15:42)
| | Функция get_magic_quotes_gpc() останется. Просто она в любом случае будет возвращать false. | |
|
|
|
|
|
|
|
для: Trianon
(28.12.2008 в 16:12)
| | Надеюсь, а то часть дистрибутивов PHP 6 (правда для разработчиков) уже выходила без неё. | |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 02:21)
| | в шестой версии php магические кавычки отменят. | |
|
|
|
|
|
|
|
для: gurza
(27.12.2008 в 02:21)
| | >обязательно так
>
><?php
> if (!get_magic_quotes_gpc())
> {
> $author = mysql_escape_string($author);
> $pswrd = mysql_escape_string($pswrd);
> }
>?>
>
|
>или так тоже будет работать корректно?
>
>
><?php
> $author = mysql_escape_string($author);
> $pswrd = mysql_escape_string($pswrd);
>
>?>
>
|
Нет, не корректно, если магические кавычки включены - можете два раза заслешить спец-символы. Придется использовать get_magic_quotes_gpc(), и даже когда её полностью выведут из PHP придется её ещё долго самостоятельно писать, чтобы обеспечить совместимость с более ранними версиями PHP. | |
|
|
|