我有简单的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。
答案 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
}
?>
结果:
输入数字=返回数字。
输入文字=返回零。
输入特殊字符=返回零。
缺少值=返回零。 (这就是我添加@的原因。)
输入负数=它被视为零值。
(补充),进入大数目也受到限制。例如,较大的页面大小可能会使某些服务器崩溃。