Вниз  PHP
- 12.06.2014 / 17:32
Helltar
  Пользователь

Helltar 
Сейчас: Offline
  1. $id = (int)$_GET['id'];

Лол

  1. $id = abs(intval($_GET['id']));

- 12.06.2014 / 22:25
prayncode
  Пользователь

prayncode 
Сейчас: Offline
Helltar, твой код ни универсальнее (почему именно модуль числа -- хз), ни быстрее (приведение в стиле С работает быстрее вызова двух функций), ни читабельнее. Вот и лол.

Изменено prayncode (12.06 / 22:26) (всего 1 раз)
- 12.06.2014 / 23:09
web_demon
  Супервизор

web_demon 
Сейчас: Offline
prayncode, и все равно со стороны php код Helltar'а правильней, хотя и работает медленнее (в одну итерацию различие абсолютно несущественно).
- 12.06.2014 / 23:42
prayncode
  Пользователь

prayncode 
Сейчас: Offline
Ну, да, в таких местах сравнивать производительность не совсем обязательно. У Ксакепа там ещё много вкуснятины для мух.
- 13.06.2014 / 21:07
Ксакеп
  Модератор форума

Ксакеп 
Сейчас: Offline
prayncode, ок, пусть тогда $id — не будет являться числом (семантически), уберём is_numeric. Просто stripslashes + mysql_real_escape_string. В общем, не обходится.

Изменено Ксакеп (13.06 / 21:07) (всего 1 раз)
- 13.06.2014 / 21:36
web_demon
  Супервизор

web_demon 
Сейчас: Offline
Ксакеп, ну так заранее нужно думать, будет у тебя число или нет. Если число, то сразу пропускать через abs(intval()) и все, можно выводить, совать в запросы и не боятся, никакой уязвимости не будет априори.

А вот со строками сложней. Их перед выводом (или можно при получении сразу, как тебе нужно) нужно пропускать через htmlentities($string, ENT_QUOTES, 'UTF-8') , она обрабатывает все символы у которых есть html представления, то бишь уже можно написать
echo $string; и это уязвимостью не будет.

Если строку нужно засунуть в запрос то юзать mysql_real_escape_string() нужно непосредственно перед вставкой переменной в запрос, то есть так:
  1. mysql_query('SELECT * FROM `users` WHERE `user` = "'.mysql_real_escape_string($string).'";');
Потому как эта функция насует в переменную слэшей и испортит изначальные данные, а ведь потом переменная может быть нужна для вывода и тд.

В общем если ты написал тот код, то позор тебе.

Изменено web_demon (13.06 / 21:38) (всего 5 раз)
- 13.06.2014 / 22:09
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
web_demon, это один из самых полезных постов в этой теме! Коатко и доходчиво! Может тоже создать тему "микростатьи и хитрости PHP?
__________________
 let live
- 13.06.2014 / 22:11
web_demon
  Супервизор

web_demon 
Сейчас: Offline
aNNiMON, та ну, может разрожусь постом в статьи, хитростей то раз два и обчелся.
- 14.06.2014 / 13:38
skyezeno
  Пользователь

skyezeno 
Сейчас: Offline
web_demon (13.06.2014/21:36)
Ксакеп, ну так заранее нужно думать, будет у тебя число или нет. Если число, то сразу пропускать через abs(intval()) и все, можно выводить, совать в запросы и не боятся, никакой уязвимости не будет ап
web_demon прекратить
использование Mysql, вместо
этого вы используете Mysqli
класс e.g
  1. $mysqli = new mysqli($dbhost, $dbusername, $dbpassword, $dbname)
  2. if (mysqli_connect_errno())
  3. die('Connection error: '.mysqli_connect_error());
  4. $mysqli->query('SELECT * FROM `users` WHERE `user` = "'.$mysqli->real_escape_string($string).'";');
  5. $mysqli->close();

или

  1. $mysqli = mysqli_connect($dbhost, $dbusername, $dbpassword, $dbname);
  2. if (mysqli_connect_errno())
  3. die('Connection error: '.mysqli_connect_error());
  4. mysqli_query($mysqli, 'SELECT * FROM `users` WHERE `user` = "'.mysqli_real_escape_string($string).'";');
  5. mysqli_close($mysqli);
где
$dbhost = база данных
  хоста $dbusername = база
  данных имя пользователя
$
dbpassword = ваш пароль базы
  данных
$dbname = имя
  вашей базы данных

Изменено web_demon (14.06 / 13:51) (всего 1 раз)
- 14.06.2014 / 13:50
web_demon
  Супервизор

web_demon 
Сейчас: Offline
skyezeno, Да, mysqli быстрее и дают больше возможностей, и поэтому я их и использую :-D
Но вот именно в твоем случае ничего не меняется по сравнению с mysql. Все равно нужно следить за тем, чтоб фильтровать переменные перед запросом.

Не фильтровать можно только в случае использования подготовленных запросов, например так (пример из гугла):
  1. $stmt = $mysqli->prepare('INSERT INTO `language` VALUES (?, ?, ?, ?)');
  2. $stmt->bind_param('sssd', $code, $language, $official, $percent);
  3.  
  4. $code = 'DEU';
  5. $language = 'Bavarian';
  6. $official = "F";
  7. $percent = 11.2;
  8.  
  9. /* выполнение подготовленного выражения  */
  10. $stmt->execute();

PS: for code highlight use [code][/code] or [code php][/code], not [php][/php].
And write in English please. We don't understand translated russian by google.

Изменено web_demon (14.06 / 14:00) (всего 3 раза)
Наверх  Всего сообщений: 1350
Фильтровать сообщения
Поиск по теме
Файлы топика (36)