PHP分页安全

时间:2014-02-14 10:15:54

标签: javascript php sql-injection

我有简单的jTable jQuery网页。 由于我在上一个主题中没有收到太多回复: Safe MySQL password on shared hosting,我已经开始自己研究了。 我正在使用基于PHP的脚本进行MySQL连接和分页。 根据我的研究,除非直接访问和/或替换PHP文件,否则黑客不会损害用户没有输入数据的查询。因此我决定把它放在我的网络根目录之上。 我为jTable添加了分页功能,它使用SQL查询和JS脚本中的一些输入数据。 出于天国的考虑,我决定保护这个查询免受任何恶意SQL注入。

查询:

"SELECT * FROM people LIMIT " . $_GET["jtStartIndex"] . "," . $_GET["jtPageSize"] . ";"

我所做的是我为int添加了强制转换,例如:

"SELECT * FROM people LIMIT " . (int)$_GET["jtStartIndex"] . "," . (int)$_GET["jtPageSize"] . ";"

足够安全吗? 据我所知,任何将去那里的字符串都会被(int)cast解析为0。

1 个答案:

答案 0 :(得分:1)

有些人认为准备语句是sql注入安全的唯一方法,但事实并非如此,做手动过滤也很有效(但是很冗长)。

在这种情况下,解决方案很好但它可以是包装器(例如用于捕获错误)

<?php
// this function is not needing unless it is used recurrently.
function safe_get_int($value) { 
     return intval(@$_GET[$value]); 
}
$init= safe_get_int("jtStartIndex") ;
$page= safe_get_int("jtPageSize") ;
if (($init>0 && $init<=9999) && ($page>0 && $page<100)) {
   $sql = "SELECT * FROM people LIMIT {$init},{$page};";
} else {
   $sql = "SELECT * FROM people LIMIT 0,20;"; // standard value
}
?>

结果:

输入数字=返回数字。

输入文字=返回零。

输入特殊字符=返回零。

缺少值=返回零。 (这就是我添加@的原因。)

输入负数=它被视为零值。

(补充),进入大数目也受到限制。例如,较大的页面大小可能会使某些服务器崩溃。