【发布时间】:2014-04-15 19:51:25
【问题描述】:
以下代码存在 SQL 漏洞,我需要一些帮助来保护它;我不是 PHP 或 MySQL 的向导。
我已经四处搜索并看到了一些与 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> ";
}
?>
证明代码实际上是易受攻击的 在您的网址末尾添加 ?pg=mysql
你应该会收到一个 MySQL 语法错误
【问题讨论】:
-
您通常应该检查代码的所有输入,特别是 $_GET['pg'] 的值 - 只需在将输入传递到任何其他代码部分之前检查输入的类型和值,不不管它是否与 SQL 相关。
-
那么下面的内容对我有什么用 add_slashes,mysql_escape_string,mysql_real_escape_string 或者我必须做一个 preg_match
-
简单的解决方法是使用检查强制转换为整数 is_numeric($pg) 如果不是则使用默认值 (1) 转义数据然后查询。
标签: php sql pagination