首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP安全-清理和清理

PHP安全-清理和清理
EN

Stack Overflow用户
提问于 2011-01-22 03:13:50
回答 5查看 1.4K关注 0票数 1

我已经从http://www.verot.net/php_class_upload.htm构建了一个围绕class.upload的脚本

基本上,我的所有图像都存储在服务器上一个名为/images/的目录中

我构建的脚本基本上是从我的网站(如/xyzDir/tomnjerry.jpg?w=100&h=100&fill=1&color=fff )获取一些参数

然后是mod_rewrite,它将文件从/xyzDir/读取到php脚本中,然后转换宽度和高度并返回图像。

最近,我注意到一些来自土耳其的笨蛋试图将奇怪的字符输入到参数w=h=

在我的脚本中,我检查以确保宽度和高度只允许整数,填充可以是1或2,颜色只能是我通过数组检查的确定值。

我只是想看看是否还有其他我应该做的事情,以避免被黑客攻击。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-22 04:10:50

对于所有用户提供的(或不受信任的)输入,请始终记住,对其进行过滤,将其退出。

读取用户提供的数据时,将其过滤为已知值。请勿列入黑名单!Always always 将您期望得到的内容列入白名单。如果您期望的是十六进制数字,请使用正则表达式进行验证,如:^[a-f0-9]+$。弄清楚你期望的是什么,并朝着它过滤。你的文件名除了字母、数字和.之外都没有别的吗?然后过滤到^[a-z0-9.]+$。但是,不要开始考虑将一些东西列入黑名单。恐怕行不通。

当使用用户数据时,适当地对其进行转义以供手头使用。如果它在数据库中,要么将其绑定为参数化查询,要么使用数据库的转义函数对其进行转义。如果您正在调用shell命令,请使用escapeshellarg()对其进行转义。如果您在正则表达式模式中使用它,请使用preg_quote()对其进行转义。还有更多,但你明白我的意思。

在输出用户数据时,对于您要输出的格式,要正确地对其进行转义。如果要将其输出为HTML或XML,请使用htmlspecialchars()。如果出于某种原因要输出到原始标头,请避开任何换行符(str_replace(array("\r", "\n"), array('\r', '\n'), $string))。等等等等。

但始终使用白名单进行过滤,并始终使用上下文的正确方法进行转义。否则你很有可能会错过一些东西……

票数 9
EN

Stack Overflow用户

发布于 2011-01-22 03:23:04

创建一个验证类来验证您的post参数,如下所示。

代码语言:javascript
复制
class MyValidation
{
    public function is_interger($val)
    {
       return is_int($val);
    }

    public function within_range($val,$min,$max)
    {
        if($this->is_interger($val))
        {
            return ($val < $max && $val > $min);
        }
        return false;
    }

    public function is_hex($val)
    {
        return preg_match("/^([a-f0-9]{3}){1,2}$/",$val);
    }
}

并使用来验证您的值。

示例:

代码语言:javascript
复制
$Validator = new MyValidation();

if($Validator->is_hex($_POST['color']))
{
    //Sweet.
}
票数 2
EN

Stack Overflow用户

发布于 2011-01-22 03:16:53

您应该使用intval()来确保宽度和高度是整数

代码语言:javascript
复制
$width = intval($_GET['w']);
$height = intval($_GET['h']);

你可以做到

代码语言:javascript
复制
$fill = $fill == 1 ? 1 : 2;

这是一个三元运算符,所以如果它是1以外的任何值,它将被设置为2。

至于十六进制的验证,十六进制的规则规定它必须在0-9/A-F的范围内。

代码语言:javascript
复制
$color = preg_replace('/[^0-9a-f]/i', "", $_GET['color']);

希望这能有所帮助。(应该注意的是,我建议的代码将执行使其适合您的页面所需的操作,而不是事先确认是有效的)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4762824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档