2012-02-11 2 views
0

Следующий код уязвим для SQL, и мне нужна помощь в его защите; Я не мастер с PHP или MySQL.PHP Pagination SQL Security

Я искал вокруг и видел некоторые очень полезные вещи, чтобы сделать с MySQL реального побега строки и т.д., но при реализации он просто вызывает белую страницу

if(!isset($_GET['pg'])) { $page = 1; } else { $page = $_GET['pg']; } 
    $select = (($page * 20) - 20); 
$mysql_result = mysql_query("SELECT `id` FROM `{$lgsl_config['db']['prefix']}{$lgsl_config['db']['table']}` WHERE ".implode(" AND ", $mysql_where)." ORDER BY id ASC LIMIT $select, 20") or die(mysql_error()); 

<? 
$servers = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM data_servers"),0); 
$pages = ceil($servers/20); 

if(!isset($_GET['pg'])) { $page = 1; } else { $page = $_GET['pg']; } 

if($page > 1) 
{ 
$prev = ($page - 1); 
echo "<a href='?pg=$prev'>[Inapoi]</a> "; 
} 

for($show = 1; $show <= $pages; $show++) 
{ 
if(($page) == $show) 
{ 
echo $show; 
} 
else 
{ 
echo " <a href='?pg=$show'>[$show]</a> "; 
} 
} 

if($page < $pages) 
{ 
$next = ($page + 1); 
echo " <a href='?pg=$next'>[Next]</a> "; 
} 
?> 

Доказательство того, что код является Infact уязвимым на конце ваш URL просто добавить ? рд = MySQL

и вы должны получить ошибку синтаксиса MySQL

+0

Обычно вы должны проверить все входы вашего кода, в частности значение $ _GET ['pg'] - просто проверьте тип и значение ввода, прежде чем передавать его в любую другую часть кода, независимо от того, является ли это SQL связанных или нет. – Stan

+0

Так может ли быть использовано для меня использование add_slashes, mysql_escape_string, mysql_real_escape_string или мне нужно будет сделать preg_match – C0nw0nk

+1

Простым решением является использование check cast для integer is_numeric ($ pg), если нет, то используйте значение по умолчанию (1) escape-данные и затем запрос. –

ответ

1

Поскольку вы не используете $page напрямую, но вы математическая операция на нем, если она не является числовым значением, она будет оценена как 0, если она не является числом (например, если это строка).

Я предложил бы в любом случае, чтобы добавить некоторые элементы управления, просто чтобы быть уверенным:

if(!isset($_GET['pg']) || !is_numeric($_GET['pg'])) { $page = 1; } else { $page = (int) $_GET['pg']; } 

Таким образом, вы уверены, что $page держит целое.

В этом случае вам не нужна функция эвакуации, но если вы используете непосредственно любую другую переменную $_GET или $_POST, тогда вы должны ее рассмотреть.

+0

Спасибо Энтропия, которая, кажется, хорошо выполняет свою работу, я пробовал? Pg = mysql, и я не получаю больше синтаксических ошибок. Не уверен, есть ли другие способы тестирования для инъекций mysql? Но ваш код, похоже, отлично справился с работой :) – C0nw0nk

+0

Таким образом, не может быть инъекции mysql с этой переменной, поскольку все типы строк, переданные через '$ _GET ['pg']', преобразуются в число. Если это вам помогло, не забывайте: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work;) – entropid

+0

Да, он больше не отображает никаких синтаксических ошибок, если только Конечно, я делаю? pg = 0 – C0nw0nk

0

Я бы проверить эти ссылки, внимательно их прочитать и понять, что они говорят г, чтобы обеспечить код и сервер

http://phptutorial.info/?mysql-real-escape-string
http://www.sitepoint.com/php-security-blunders/
http://roshanbh.com.np/2008/05/tighten-php-security-functions.html

Они помогли мне, когда я узнавал аспекта безопасности PHP кодирования