Laravel 5 Global Mutator可以逃脱所有html字符?

时间:2017-01-13 11:46:24

标签: laravel xss sanitization htmlspecialchars

构建API但因为我在API响应中动态创建Vue.js中的表等,所以无法使用刀片html转义。

我知道在我的模型中我可以使用mutator:

public function getNameAttribute($value) {
    return strtolower($value); // example
}

但我们有很多字段可以在很多模型中编辑。有没有办法可以使用htmlspecialchars()自动返回所有值?

或者是唯一可以更改API响应以在每个字段上运行htmlspecialchars()的选项吗?

感谢。

编辑:使用Laravel Spark。建议的答案是创建一个新模型并在我们的模型上扩展它,但Spark模型已经有一长串扩展类。

3 个答案:

答案 0 :(得分:0)

您可以创建一个扩展Model类的类,并使所有模型扩展此类而不是Model。在类覆盖getAttributeValue方法中:

protected function getAttributeValue($key)
{
    $value = $this->getAttributeFromArray($key);

    if ($this->hasGetMutator($key)) {
        return $this->mutateAttribute($key, $value);
    }

    if ($this->hasCast($key)) {
        return $this->castAttribute($key, $value);
    }

    if (in_array($key, $this->getDates()) && ! is_null($value)) {
        return $this->asDateTime($value);
    }

    return is_string($value) ? htmlspecialchars($value) : $value;
}

答案 1 :(得分:0)

除了扩展课程。替代解决方案是使用特征。

创建新特征

namespace App\Traits;

trait ExtendedModel {

    public function getNameAttribute($value) 
    {
        return strtolower($value); // example
    }
}

在所需模型中使用特征:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Traits\ExtendedModel;

class MyTable extends Model
{
    use ExtendedModel;
}

答案 2 :(得分:0)

我就是这样做的。

我会制作一个特性,然后将这个特性附加到你想要的所有模型上。

该特征会使用您自己的逻辑覆盖getAttributeValue($key)方法。像这样:

trait CastAttributes {

    public function getAttributeValue($value) 
    {
        $value = $this->getAttributeValue($value);
        return is_string($value) ? strtolower($this->getAttributeValue($value)) : $val;
    }
}

那个beign说,你很可能不想完全抛出一切。在那种情况下,我会这样做:

trait CastAttributes {

    protected $toLower = [];

    public function getAttributeValue($key) 
    {
        $value = $this->getAttributeValue($key);
        return in_array($key, $this->toLower) ? strtolower($value) : $value;
    }
}

然后使用您实际想要转换为小写的所有属性覆盖$toLower数组。