只想对我以前的所有问题说,谢谢你帮我解决了一些问题。我当然是个菜鸟,但学习很关键。
我正在创建一个函数,在将输入提交到查询之前对其进行清理,以确保它是安全的。这些是我最后一个帖子中的一些问题以及一些新问题。这个问题针对那些非常善于保持投入消毒和安全的人。
这是我执行所有查询的方式。
$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,但我的一些朋友声称它有一些漏洞,所以我不想使用它。再次感谢:)
答案 0 :(得分:0)
我的问题是,这是使用此清理功能的最佳方法吗?
这是进行消毒的好方法。所有消毒方法都会随着时间的推移而改善。
有没有更好的方法来解决这个问题?
如果它是为您提供用户输入的Web应用程序,您可能希望在UI上引导用户满足您的期望(例如(输入公寓号,如果适用。否则,请将其留空))。
JavaScript可用于强制执行某些行为。
当数据到达您的PHP脚本时,在卫生过程之外还会分析数据是否在X和Y之间。例如,如果客户进入年龄,请检查年龄是否有效。
如果是字符串,并且您不希望有任何攻击性标记,请使用strip_tags
删除它们。执行某些字符的编码/解码/转义 - 考虑使用mysqli_real_escape_string
,htmlspecialchars
。
此外,如果一次运行多个insert语句,请使用存储的例程。无论例程如何,都使用事务。回滚除非所有交易都按您的要求完成。
不使用select * from ...
,而是选择所需的列。如果存在覆盖指数,某些结果(仅需要2-3列)可能会显着加快。
如果您的应用使用system
,exec
等,则使用escapeshellargs
/ escapeshellcmd
将非常有用。
在UI上显示信息时,请确保使用htmlspecialchars
显示相关字段,以减少/消除XSS的可能性。另外,请考虑在必要时使用urlencode
/ json_encode
。
看看http://www.wikihow.com/Prevent-Cross-Site-Request-Forgery-%28CSRF%29-Attacks-in-PHP,通过示例展示防止CSRF攻击的方法。
对你的问题的评论都是你应该考虑的好想法,而且重要的是 - 你已经朝着正确的方向迈出了一步 - 对你有好处!