在php中将url存储在MySql数据库中,
我不得不使用以下,
mysql_real_escape_string('xyz/xyz.html')
不推荐使用mysql,现在我使用Yii 2.0(作者声称它是安全的)。
我使用了它的Gii CRUD,现在这个网址很容易存储,无需转义。
(如果它使用PDO,那么准备好的语句可能会解决上述问题)
我想知道Yii-2.0是否会处理与在数据库中存储内容然后将它们分散在视图中相关的重要安全问题。
答案 0 :(得分:5)
是的,Yii2在执行SQL查询时使用PDO,但我不建议希望它可以避免所有潜在的安全问题。 我通常建议2条预防规则:
当您使用网址时,我将为您的案例描述示例。它将展示几个可以帮助您提高应用程序安全性的Yii2功能。
如果您使用CRUD创建模型和控制器,则需要在ActiveRecord::rules()
方法中进行少量修改(在存储URL的模型中):
class SomeActiveRecord extents ActiveRecord {
// ...
public function rules(){
return [
[ ['attribute_that_store_url', 'url'] ],
];
}
}
此代码验证将从表单加载的值。 More details about this validator
如果要使用DetailView显示此值(默认情况下为CRUD生成的视图),则可以使用内置formatter:
echo DetailView::widget([
'model' => $model,
'attributes' => [
'attribute_that_store_url:url'
'title', // title attribute (in plain text)
'description:html', // description attribute in HTML
[ // the owner name of the model
'label' => 'Owner',
'value' => Html::encode($model->owner->name),
],
'created_at:datetime', // creation date formatted as datetime
],
]);
您可以在课程yii\i18n\Formatter
中找到的所有可用格式化程序(例如网址)都将通过方法yii\i18n\Formatter::asUrl()进行预先处理。
在更复杂的情况下,当您想手动显示值(没有类似的小部件)时,您可以通过Yii::$app->formatter
将此格式化程序作为应用程序组件进行访问。
此外,您可以使用Html::encode
对值进行编码,详情请参见Encoding and Decoding Content
在显示之前预处理html可以使用HtmlPurifier,只允许保留某些标记。
答案 1 :(得分:4)
是。 save()
方法负责SQL注入。这同样适用于QueryBuilder
。
对于XSS攻击,您必须在使用Html::encode($var)
或使用\yii\helpers\HtmlPurifier::process($this->$attribute)
呈现之前转义用户输入,然后再将其保存到数据库中。
CRSF验证由Yii自动处理。
更多信息:
答案 2 :(得分:2)
是的,Yii确实负责安全事务。
如果它使用PDO,准备好的陈述可能会解决上述问题
是的,Yii在任何地方使用PDO预处理语句,因此通常不需要转义。 SQL查询只有两个例外,您必须自己处理绑定预准备语句:
WHERE
条件,否则不需要手动转义。然后你必须使用\yii\db\Expression()并记住它会像你编写的那样完全转到SQL - 需要手动数据绑定。由于可能存在跨站点脚本(XSS)攻击,因此视图呈现可能很危险。为避免这种情况,请始终使用Views Security指南文章中描述的输出过滤。
阅读Security best practices指南文章,了解详情并构建安全的应用程序