你好
我和我的网站处于原型阶段。在我在本网站上提出this问题之后,经过额外的阅读后,我结束了使用mysql prepared statements
。
以我的新思维方式,我想确定我理解的东西正确所以我的两个问题是:
如果我在不受信任的数据插入过程中使用预准备语句
mysql,我无需使用mysqli_real_escape_string function
。我
右
如果我在提取时使用预备语句&显示来自的数据 mysql db将屏幕显示为html,(出于安全考虑)它会更好 使用html净化器类,所以我应该使用html净化器类。我是对的吗?
你能以我的思维方式指导我吗?我的方法有意义吗?
感谢,BR
答案 0 :(得分:1)
是的,确实如此
无论如何,mysqli_real_escape_string函数与任何保护无关
html净化器是一件好事,但是如果预期用户输入中没有HTML,你可以用惰性htmlspecialchars()
函数调用替换它。
关于预准备语句的唯一提要是:它们仅涵盖基本标量值,并且对标识符(表和字段名称)或数组等复杂值无能为力。
答案 1 :(得分:1)
如果我在不受信任的数据插入mysql期间使用预准备语句,我不需要使用mysqli_real_escape_string函数。我是对的吗?
你明白了。准备好的声明有自己的逃脱程序。
如果我在提取时使用预备语句&将数据从mysql db显示为屏幕为html,(出于安全原因)最好使用html净化器类,所以我应该使用html净化器类。我是对的吗?
你也是对的。当您打印您的HTML你必须确保让他们有两个解决方案是安全的:激进的一个:逃避与everithing htmlspecialchars
或较软的一个,让安全的HTML标签:使用htmlpurifier
我还希望您向我们介绍一条规则,该规则将带您进入一个安全且更舒适的网站:过滤掉。
准备好的声明和htmlpurifier
在这里“逃脱”,这意味着您将以您可以理解的输出方式发送数据。
部分rull中的过滤器可让您研究用户输入的内容。一个很好的例子是日期格式。
也许您希望他们输入英文格式为Y-m-d的日期。如果他们不这样做你的网站将无法工作,所以你必须要求他们以正确的方式再次输入日期。
有一种方法需要记住过滤:filter_var
答案 2 :(得分:1)
如果我在不受信任的数据插入mysql期间使用预准备语句,我不需要使用mysqli_real_escape_string函数。我是对的吗?
正确
如果我在提取时使用预备语句&将数据从mysql db显示为屏幕为html,(出于安全原因)最好使用html净化器类,所以我应该使用html净化器类。我是对的吗?
使用预准备语句将保护您的数据库免受SQL注入。它对XSS攻击无能为力。你需要某种防御措施。
由于“保护数据库”和“保护HTML”是完全不同的问题,因此选择一个解决方案与另一个解决方案的选择无关。
使用基于白名单的过滤器构建一个真正的HTML解析器(我假设HTML净化器就是其中之一)是一个理智的选择(如果你想允许一些 HTML)。
答案 3 :(得分:1)
1)如果使用预准备语句插入数据,则无需转义其中的引号和其他特殊字符。基本上,您可以防止SQL注入。但是,您仍需要清理数据,以使其不包含XSS攻击。当您正在研究HTML Purifier时,您正处于正确的轨道上。此外,您需要编写业务逻辑代码来验证您的数据,以确保它确实是您所期望的(类型检查,范围检查等)。
2)理论上,您应该在向用户显示之前清理数据,并且HTML净化器可以执行此任务。但是,在实践中,您会注意到HTML净化器是一个非常繁重的库,因此不适合在每次显示数据时使用。性能更好的解决方案是在数据插入数据库之前对数据运行HTML净化器,然后在没有额外验证的情况下显示它。你本质上是在努力确保数据库是干净的,因为如果数据库是干净的,那么来自那里的任何东西肯定都是干净的。这也是一般安全的好方法。
您的验证程序应该是:
if( ! isValid( $rawData ) ) {
return;
}
$purifiedData = htmlPurifier( $rawData );
mysql_prepared_insert( $purifiedData );
当然,这只是一种方法。有许多方法可以获得良好的安全性和消毒数据。此外,您必须了解使用HTML Purifier的原因。当您希望允许用户发布某些 HTML标记时,您应该使用它,但不是全部。如果您想阻止所有 HTML,那么htmlspecialchars
功能将以更有效的方式完成这项工作。当您拥有要允许的标记白名单并阻止其他所有内容时,HTML净化器很有用。您还可以使用它来删除所有标记而不是转义它们,从而使文本看起来比通过htmlspecialchars
后的文本略好。