这是一个很好的消毒功能吗?

Is this a good Sanitization function?

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

我正在创建一个函数,在将输入提交到查询之前对其进行清理以确保它是安全的。这些是我上一个线程中的一些问题以及一些新问题。这个问题是针对那些非常善于保持输入的安全和安全的人。

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

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

主要是 "insert" 查询或任何其他类型的查询,我都是这样做的。

$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 的脚本,但我的一些朋友声称它有一些漏洞,所以我不想使用它。再次感谢:)

My question is, is this the best way of using this sanitization function?

这是执行清理的好方法。所有消毒方法都会随着时间的推移而改进。

Is there a better way of going about this?

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

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

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

如果它是一个字符串,并且您不希望有任何令人反感的标签,请使用 strip_tags 将其删除。执行某些字符的 encoding/decoding/escaping - 考虑使用 mysqli_real_escape_stringhtmlspecialchars.

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

而不是使用 select * from ...,select 所需的列。如果有覆盖索引,某些只需要 2-3 列的结果可能会显着加速。

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

在UI上显示信息时,确保相关字段显示htmlspecialchars,以reduce/eliminate XSS机会。还可以根据需要考虑使用 urlencode/json_encode

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

对你的问题的评论都是你应该考虑的好想法,重要的是 - 你已经朝着正确的方向迈出了一步 - 对你来说太好了!