【发布时间】: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