|
|
|
| Достаточно такого кода для защиты?
<?php
if(empty($_GET['id']) or isset($_GET['id'])) {
$id = $_GET['id'];
}
if(!preg_match("|^[\d]+$|", $id)) {
exit("<p>Не правильный формат запроса! Проверте URL!</p>");
}
?>
|
| |
|
|
|
|
|
|
|
для: brys
(12.02.2008 в 18:51)
| |
<?
if(empty($_GET['id']) or isset($_GET['id'])) { ....
?>
|
<?
$id = ((isset($_GET['id'])) && ($_GET['id'] == (int)$_GET['id'])) ? (int)$_GET['id'] : null;
if ($id === null) echo 'error';
?>
|
[поправлено модератором] | |
|
|
|
|
|
|
|
для: brys
(12.02.2008 в 18:51)
| | тогда уж
if(!empty($_GET['id']) or isset($_GET['id'])) { ... } | |
|
|
|
|
|
|
|
для: Петр
(12.02.2008 в 20:41)
| |
if (!isset($_GET['id']) || !is_int($_GET['id'])) error();
|
| |
|
|
|
|
|
|
|
для: bronenos
(12.02.2008 в 21:08)
| | bronenos, ну сколько можно? | |
|
|
|
|
|
|
|
для: Unkind
(12.02.2008 в 22:46)
| | Тих-тих-тих O:-)
Я не сразу увидел тему пососедству, где было про ИНТ, и не думал что ИНТ подведет (казалось бы, для таких ситуация как раз), приношу извинения) | |
|
|
|
|
|
|
|
для: bronenos
(13.02.2008 в 00:01)
| | Как думаете, достаточно ли передаваемые параметры проверять только на допустимые символы через регулярку? | |
|
|
|
|
|
|
|
для: Freddie_X
(13.02.2008 в 00:37)
| | Какие такие допустимые символы?
Логин, email, наверное, стоит проверить перед помещением в БД, id привести к int.... В пароле, например, нет недопустимых символов...
Посмотрите задачу 21 из соответствующего раздела.. | |
|
|
|
|
|
|
|
для: bronenos
(13.02.2008 в 00:01)
| | > Я не сразу увидел тему пососедству
Я подобной темы тоже не видел. Просто я же Вам сравнительно недавно уже говорил про это. | |
|
|
|
|
|
|
|
для: brys
(12.02.2008 в 18:51)
| | Я лично всегда все переменные проверяю так:
Если число, то $var = intval($_GET['var']);
Если засунуть в MySQL, то $var = mysql_escape_string($_GET['var']);
Если вывести на экран, то $var = htmlspecialchars($_GET['var'], ENT_QUOTES);
Ну а остальное по потребностям... | |
|
|
|
|
|
|
|
для: DEM
(13.02.2008 в 13:09)
| | А если кто-то захочет сделать sql-инъекцию, одного mysql_escape_string будет недостаточно, т.к. запрос может быть без кавычек. Не пойму я что-то.... | |
|
|
|
|
|
|
|
для: Freddie_X
(13.02.2008 в 13:17)
| | Какой запрос? Все строки в запросах нужно помещать в кавычки, без этого и работать не будет. А что там от пользователя пришло - если оно экранировано, без разницы.
SELECT * FROM `table` WHERE text = '$text'.
Для защиты от sql-инъекции mysql_escape_string() достаточно (только надо проверить magic_quotes - если они включены, mysql_escape_string() уже применять не нужно. get_magic_quotes_gpc() ). | |
|
|
|
|
|
|
|
для: kasmanaft
(13.02.2008 в 13:30)
| | Ну, если переданные запросу данные - строковые, то с этим понятно!
А если Числовые данные? Их же не надо выделять кавычками. Получается, что можно сделать скл-инъекцию даже с mysql_escape_string()?
К примеру:
<?php
mysql_query("SELECT * FROM table WHERE id = $id");
// если в $id вписать, к примеру,
// 1; UPDATE table SET id = 666 WHERE id = 1
// то можно изменить любые числовые данные в БД
?>
|
Разъясните, пожалуйста! | |
|
|
|
|
|
|
|
для: Freddie_X
(13.02.2008 в 13:45)
| | Когда ожидается прием числовых данных, то:
и уязвимости нет. | |
|
|
|
|
|
|
|
для: Thrasher
(13.02.2008 в 14:33)
| | Аааа, всё понял! Спасибо за разъяснение :) | |
|
|
|
|
|
|
|
для: Freddie_X
(13.02.2008 в 15:24)
| | Я и числа в кавычки беру, все пашет у меня везде | |
|
|
|
|
|
|
|
для: bronenos
(13.02.2008 в 15:53)
| | а мне вот нравится работать с stmt в mysqli
$stmt = $mysqli->stmt_init();
$stmt->bind_param('ssi',$string_var_1, $string_var_2, $integer);
$stmt->execute();
|
зачем на уровне PHP делать то, что можно переложить на БД, притом что она это умеет делать лучше? | |
|
|
|
|
|
|
|
для: brys
(12.02.2008 в 18:51)
| | а что вы думаете на счет функции ctype_digit()
можно ли на нее положиться?
<?
if(ctype_digit($_GET['id']))
echo 'ГУД!!!';
else
echo 'Не есть гуд!';
?>
|
| |
|
|
|
|
|
|
|
для: а-я
(14.02.2008 в 04:26)
| | а какая разница что будет добавленно в where id
текст или цифра - это всеравно строковое значение...
или нет?
в любом случае там нужна будет кавычка для обрыва запроса и подстановки union...
или? | |
|
|
|
|
|
|
|
для: moonfox
(14.02.2008 в 05:28)
| | Просто возьмите за правило никогда не подсовывать в запрос то, что пришло с инета. пропустите через какую то промежуточную функццию, и все лишние хвосты отвалятся или вызовут ошибку. | |
|
|
|
|
|
|
|
для: moonfox
(14.02.2008 в 05:28)
| | Зачем мне в запросе строка, когда поле типа integer? | |
|
|
|
|
|
|
|
для: mihdan
(14.02.2008 в 10:55)
| | вам не нужно
а взломщику всеравно что у вас int или char
вроде) | |
|
|
|