【发布时间】:2019-05-23 11:20:21
【问题描述】:
我经常使用这样的方法来过滤输入。如图所示使用preg_match( ),或者有时使用switch( ),它仅在POST/GET 变量是特定数量的关键字之一时起作用。
if (preg_match("/^[0-9]+$/",$_POST['id_to_clear']))
{
db_query("UPDATE `table` SET `error`=0, `progress`=0 WHERE `id` = {$_POST['id']}");
}
一般来说,直接在 SQL 查询中使用 POST/GET 变量是一个巨大的危险信号。但在这种情况下,它似乎非常安全。有什么办法可以出错吗?我没看到的东西?
【问题讨论】:
-
为什么不用参数?不要试图重新发明轮子。
-
使用准备好的语句:dev.mysql.com/doc/refman/8.0/en/…
-
是的,我同意@MitchWheat 使用准备好的语句。
-
"有些人在遇到问题时会想'我知道,我会使用正则表达式'。现在他们有两个问题。” ——Jamie Zawinsky。与您展示的正则表达式过滤解决方案相比,查询参数既能更安全地防止 SQL 注入,又更易于编码,这是普遍的看法。
标签: mysql database security sql-injection