这是一个很好的消毒功能吗?
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_string
、htmlspecialchars
.
此外,如果一次有多个插入语句运行,请使用存储例程。使用事务,不管例程。回滚,除非所有事务都按您的意愿完成。
而不是使用 select * from ...
,select 所需的列。如果有覆盖索引,某些只需要 2-3 列的结果可能会显着加速。
如果您的应用使用 system
、exec
等,利用 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 攻击的方法。
对你的问题的评论都是你应该考虑的好想法,重要的是 - 你已经朝着正确的方向迈出了一步 - 对你来说太好了!
只想对我之前的所有问题说一句,感谢您帮我解决了一些问题。当然我是菜鸟,但学习是关键。
我正在创建一个函数,在将输入提交到查询之前对其进行清理以确保它是安全的。这些是我上一个线程中的一些问题以及一些新问题。这个问题是针对那些非常善于保持输入的安全和安全的人。
这就是我进行所有查询的方式。
$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_string
、htmlspecialchars
.
此外,如果一次有多个插入语句运行,请使用存储例程。使用事务,不管例程。回滚,除非所有事务都按您的意愿完成。
而不是使用 select * from ...
,select 所需的列。如果有覆盖索引,某些只需要 2-3 列的结果可能会显着加速。
如果您的应用使用 system
、exec
等,利用 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 攻击的方法。
对你的问题的评论都是你应该考虑的好想法,重要的是 - 你已经朝着正确的方向迈出了一步 - 对你来说太好了!