Проблема Php Numrows - PullRequest
       6

Проблема Php Numrows

0 голосов
/ 22 октября 2009

Я использую строку запроса для доступа к своим страницам. Я пытаюсь сделать, если кто-то вводит неизвестную строку запроса вручную, а затем перенаправить куда-то ..

Например:

URL: test.php? M = 1 (это действительный URL) test.php? m = 1324234 (это недопустимый URL) test.php? m = 1asdaa (это недействительный URL)

include("config/database.inc");
$qm=$_GET['m'];
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
          header("Location: index.php"); 
          exit;
     }

В базе данных у меня две строки, LINE 1: acc = 1; ЛИНИЯ 2: acc = 2;

Если я введу URL-адрес: test.php? M = 12312431, то перенаправьте на index.php 'coz $ numrows = 0. Это нормально. Но если я наберу: test.php? M = 1sdfsfsf, то я получаю эту ошибку: Предупреждение: mysql_num_rows (): предоставленный аргумент не является допустимым ресурсом результата MySQL в ..

Как я могу это сделать? Нужно проверить $ _GET ['m'] перед запросом из базы данных?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 22 октября 2009

Никогда не следует помещать значение переменной GET непосредственно в запрос SQL без надлежащей фильтрации и экранирования. Ваша проблема в том, что вы позволяете вещам, которые не являются числами, вставляться в ваш SQL-запрос. В этом конкретном случае ваш тест безвреден и содержит только ошибки, но злоумышленник может также сделать гораздо более опасные вещи с помощью SQL-инъекции.

Вместо этого вы действительно хотите преобразовать значение переменной в тип, с которым вы знаете, что все в порядке (в данном случае целое число), а затем запросить базу данных, используя это. Попробуйте вместо этого:

include("config/database.inc");
$qm=intval($_GET['m']);
 $query = "select acc from test where acc=$qm"; 
 $numresults=mysql_query($query);
 $numrows=mysql_num_rows($numresults);
  if ($numrows == 0){
          header("Location: index.php"); 
          exit;
     }

Обратите внимание на вызов intval (), который заставляет результат быть целочисленным значением, а не потенциально опасными строками.

1 голос
/ 22 октября 2009

Сделайте это:

$qm=intval($_GET['m']);
0 голосов
/ 22 октября 2009

Наряду с проверкой ввода или форсированием типа, как другие предлагали убедиться, что ввод имеет смысл, попробуйте выработать привычку заключать пользовательские значения, передаваемые в запрос, в кавычки, например,

$query = "select acc from test where acc='$qm'"; 

Хотя здесь вы технически сравниваете целое число со строкой, MySQL позволяет это (и будет по-прежнему использовать целочисленные ключи, где это возможно), а также предоставляет последнюю линию защиты, если вы забудете отфильтровать ввод.

0 голосов
/ 22 октября 2009

если m недопустимо, mysql_query вернет $ query = false.

Если вы предоставите «false» для mysql_num_rows, он не будет знать, какой запрос вы отправили, и правильно получит недопустимый результат numrows, например, отказ.

Проверьте, что m является целым числом с intval ($ m);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...