关于第二个问题,我和楼上那位仁兄有不同的见解。不过前提是,forumID必须是数值。不防做个实验: <?php //如果var是整数,则输入它的值,否则输入“var is not int” if (is_int($_GET['var'])) { echo $_GET['var']; } else { echo 'var is not int'; } ?> 然后访问http//domain/test.php?var=99 显示:var is not int 不知道这个问题能不能说明,GET过来值都被当作字符串处理了?那么我们运作类型戏法,加上一行: <?php //把变量var的类型强制转换为整数 $_GET['var'] = (int) $_GET['var'];//如果var是整数,则输入它的值,否则输入“var is not int” if (is_int($_GET['var'])) { echo $_GET['var']; } else { echo 'var is not int'; } ?> 然后访问http//domain/test.php?var=99 输出:99访问http//domain/test.php?var=abc 输出:0访问http//domain/test.php?var=' and 1=1 输出:0那么,这们可否认为,对于处理GET过来的整数值,运用类型戏法,可以产生较为安全的可用数据?
关于lm92讨论的is_int问题可以用is_numeric()来替代 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。 但这的不是我讨论的中心啊!我要解决的是如何读取,如何处理之后在放如mysql_query语句中
<?php
//如果var是整数,则输入它的值,否则输入“var is not int”
if (is_int($_GET['var'])) {
echo $_GET['var'];
} else {
echo 'var is not int';
}
?>
然后访问http//domain/test.php?var=99
显示:var is not int
不知道这个问题能不能说明,GET过来值都被当作字符串处理了?那么我们运作类型戏法,加上一行:
<?php
//把变量var的类型强制转换为整数
$_GET['var'] = (int) $_GET['var'];//如果var是整数,则输入它的值,否则输入“var is not int”
if (is_int($_GET['var'])) {
echo $_GET['var'];
} else {
echo 'var is not int';
}
?>
然后访问http//domain/test.php?var=99
输出:99访问http//domain/test.php?var=abc
输出:0访问http//domain/test.php?var=' and 1=1
输出:0那么,这们可否认为,对于处理GET过来的整数值,运用类型戏法,可以产生较为安全的可用数据?
如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE。 但这的不是我讨论的中心啊!我要解决的是如何读取,如何处理之后在放如mysql_query语句中
function quotes($content = NULL)
{
if (!get_magic_quotes_gpc() && !empty($content)) {
if (is_array($content)) {
foreach ($content as $key => $value) {
$content[$key] = addslashes($value);
}
} else {
$content = addslashes($content);
}
} else {}
return $content;
}还有就是根据需要对输入的数据进行检查,比如说纯数字的、小写字母的等等。比如说,我以前的小站功能和页面都不多,所以就写了一段代码来检查URL伟递过来的变量的敏感字,还做了这个敏感字列表,算比较严格的了,应该不太适合大项目使用。
array('\'', '"', '`', '#', '%', ';', '(', ')', 'select', 'update', 'delete', 'insert', 'union', 'from', 'where', 'like', 'char', 'ord', 'conv', 'ascii', 'left')
用这些函数这么处理呢?
** 功能 对字符串进行转换,回车变<br>,空格变 ,并过滤非法字符
** 参数 $str 要转换的字符串
*/
function f_TransStr($str){
$str = str_replace("&", "&", $str);
$str = str_replace("|", "|", $str);
$str = str_replace("<", "<", $str);
$str = str_replace(">", ">", $str);
$str = str_replace("'", "'", $str);
$str = str_replace("\"", """, $str);
$str = str_replace(" ", " ", $str);
$str = nl2br($str);
return $str;
}
2、没发现有安全隐患。
3、防止注入用对post参数遍历slashes即可。
4、不安全,但是都这样用。
5、没听说过。
另外,论坛其实更多的关心你的架构、可扩展性、插件技术、模板技术等等。安全只是其中一块,你把基本的安全做好了,问题不大。关于安全可以参考一下Discuz,代码写的比较安全。