【问题标题】:Is this a good Sanitization function?这是一个很好的消毒功能吗?
【发布时间】:2015-05-09 10:17:39
【问题描述】:

只想说一下我之前的所有问题,感谢您帮助我解决了一些问题。当然我是菜鸟,但学习是关键。

我正在创建一个函数,在输入提交到查询之前对其进行清理,以确保它是安全的。这些是我上一个帖子中的一些问题以及一些新问题。这个问题是针对那些真正擅长保持输入的净化和安全的人。

这就是我所有查询的方式。

$query = $dbh->prepare("SELECT * FROM table WHERE data = ?");
$query ->execute(array($data));

在主要是“插入”查询或任何其他类型的查询中,我都会这样做。

$query = $dbh->prepare("INSERT INTO table ( data ) VALUES ( :data )";
$query ->execute(array(':data'=>$data));

我通常将此方法用于需要插入大量数据的查询。我的问题是,这两种方法都有效吗?我没有绑定任何东西,因为我有我制作的这个消毒功能。

function sanitize($type, $input) { 
if ($type == "email") { $input = filter_var($input, FILTER_SANITIZE_EMAIL); }
if ($type == "int") { $input = filter_var($input, FILTER_SANITIZE_NUMBER_INT); }
if ($type == "float") { $input = filter_var($input, FILTER_SANITIZE_NUMBER_FLOAT); }
if ($type == "string") {
    $input = filter_var($input, FILTER_SANITIZE_STRING);    
    //$input = filter_var($input, FILTER_SANITIZE_ENCODED); 
    $input = filter_var($input, FILTER_SANITIZE_MAGIC_QUOTES);
    $input = filter_var($input, FILTER_SANITIZE_SPECIAL_CHARS); 
    $input = filter_var($input, FILTER_SANITIZE_STRIPPED);
    //$input = filter_var($input, FILTER_SANITIZE_URL); 
}
return $input;

}

我的问题是,这是使用此消毒功能的最佳方式吗?有没有更好的方法来解决这个问题?就像我说的,安全性是我在制作项目时最关心的问题,我不想冒险发生任何不好的事情,所以我宁愿在继续我正在制作的项目之前优化安全性。

我的最后一个问题是,做 CSRF 代币的最佳方式是什么?我尝试了一个我相信 OWASP 的脚本,但我的一些朋友声称它有一些漏洞,所以我不想使用它。再次感谢:)

【问题讨论】:

  • 准备好的语句足以抵御 SQL 注入攻击。您的清理功能是否应该防止 XSS 攻击。
  • 插入数据库表时,要确保不会发生 SQL 注入。这就是我们使用 PDO 和准备好的语句的原因。这就是您对物品进行消毒的工作停止的地方。下一步是提取数据,使用它并最终将其展示给最终用户。这是您想要防止不需要的 HTML 和潜在的 XSS 的地方。因此,不要制作您自己的预插入清理功能 - 您无法制作出比 PDO 提供的更好的功能。
  • 是的,但是 PDO 需要绑定输入来防止它。我不喜欢依赖对我有用的东西,你知道吗?我不知道怎么解释。
  • 拥有简洁明了的用户卫生并不是什么好事,它与 PDO 和绑定你根本不必考虑它。您的卫生设施可能对您来说很清楚并处理该项目的所有可能性,但可能需要针对每个项目进行定制。装订是卫生的瑞士刀。
  • 以上所有的cmets都很好作为单独的答案。为什么它们只是 cmets 而没有扩展成为答案?

标签: php mysql pdo sanitization


【解决方案1】:

我的问题是,这是使用此消毒功能的最佳方式吗?

这是执行消毒的好方法。随着时间的推移,所有的消毒方法都会得到改善。

有没有更好的方法来解决这个问题?

如果它是为您提供用户输入的 Web 应用程序,您可能希望根据您的期望在 UI 上引导用户(例如(输入公寓号码,如果适用。否则,将其留空))。

JavaScript 可用于强制执行某些行为。

当数据到达你的 PHP 脚本时,除了清理过程还会分析数据是否在 X 和 Y 长度之间。例如,如果客户正在输入年龄,请检查年龄是否在有效限制内。

如果它是一个字符串,并且您不希望有任何令人反感的标签,请使用strip_tags 删除它们。执行某些字符的编码/解码/转义 - 考虑使用mysqli_real_escape_stringhtmlspecialchars

此外,如果一次运行多个插入语句,请使用存储例程。使用事务,不管常规。回滚,除非所有事务都按您的意愿完成。

不要使用select * from ...,而是选择所需的列。如果存在覆盖索引,则某些结果(仅需要 2-3 列)可能会显着加快速度。

如果您的应用使用systemexec 等,使用escapeshellargs/escapeshellcmd 将很有用。

在 UI 上显示信息时,确保相关字段显示为htmlspecialchars,以减少/消除 XSS 的机会。必要时还可以考虑使用urlencode/json_encode

查看http://www.wikihow.com/Prevent-Cross-Site-Request-Forgery-%28CSRF%29-Attacks-in-PHP,它通过示例展示了防止 CSRF 攻击的方法。

对您的问题的评论都是您应该考虑的好想法,而且重要的是 - 您已经朝着正确的方向迈出了一步 - 对您有好处!

【讨论】:

  • "当数据到达你的 PHP 脚本时,除了清理过程还要分析数据是否在 X 和 Y 长度之间。例如,如果客户正在输入年龄,请检查年龄是否在有效限制。”我已经这样做了,这是我在使用表单时确保拥有的东西。 :D
  • 优秀。您已经在保护您的应用程序方面有了很好的基础,很高兴看到像您这样的开发人员专注于应用程序安全。
  • 是的,我对安全性知之甚少...我知道安全性的“工具”,但不知道如何正确使用它,所以它是正确的。 :P 也感谢您提供有关 CSRF 的“wikihow”。非常有帮助! :)
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多