使用 is_numeric 进行表单验证

Posted

技术标签:

【中文标题】使用 is_numeric 进行表单验证【英文标题】:Using is_numeric for form validation 【发布时间】:2013-06-22 16:58:14 【问题描述】:

我有一些链接结构如下...

http://domain.com?problem_id=23&course_id=4

GET“字段”(problem_id 和 course_id)的预期值是整数。我可以通过简单地说...来验证这些数据吗?

if (is_numeric($_GET['problem_id']))
   //It's safe, so do stuff.
 else 
   echo 'It appears you submitted a problem incorrectly.  Please contact us for assistance';
   exit;

或者这仍然对 sql 注入等恶意行为开放?

建议的解决方案

$int_problem_id = (int) $_GET['problem_id'];
if (ctype_digit($int_problem_id))
   //It's safe, so do stuff.
 else 
   echo 'It appears you submitted a problem incorrectly.  Please contact us for assistance';
   exit;

【问题讨论】:

***.com/questions/60174/… 请注意,is_numeric() 可能实际上并没有按照您的想法进行操作。以下对于 is_numeric 都将返回 true:3.14+0123.45e60xf4c3b00c0b10100111001ctype_digit() 是你要找的吗? @jcsanyi:使用 ctype_digit 是一种更好的方法。谢谢! 【参考方案1】:

是的,这是一个解决方案。此外,您还可以强制转换为 int。

$integer = (int) $_GET['problem_id'] ;

您应该保护数据库的所有输入,即使数值不会造成任何伤害,因为它们不包含特殊符号。

【讨论】:

这是必要的,还是只是另一种看待问题的方式? 这是另一种 100% 确保输入不会损害您的数据库的方法。 好酷。涉及上面 jcsanyi 的 ctype_digit,我将使用我已添加到原始帖子中的建议解决方案。好看吗?【参考方案2】:

您应该确保?problem_id= 是数字。您的所有其他字段可能仍然存在风险,因此这不是防止 SQL 注入的正确方法。您应该研究 PDO 和 mysqli,以及它们的 bindParam/bind_params 函数。

【讨论】:

对。另外,抱歉,这些数据实际上是通过 URL 输入的。请看我修改后的帖子。你的回答还有效吗? 是的。 ?problem_id 表示它是一个 GET 参数,可通过 $_GET['problem_id'] 访问,因此您走在正确的轨道上。你对变量做什么才是最重要的,你可以编写一个直接的 mysql 查询(此时你很容易受到 SQL 注入的攻击)或使用 PDO/MySQLi 为你编写查询。无论类型如何,它们都将安全地转义变量。使用整数时,它会将其绑定为整数,但是提交?problem_id=1; DROP TABLES 的人的查询将被转义,并且不会造成任何损害。 对。我实际上不会与数据库交互。所以,我认为使用我上面提出的解决方案应该很安全。感谢您的回复。

以上是关于使用 is_numeric 进行表单验证的主要内容,如果未能解决你的问题,请参考以下文章

使用 纯JQuery 进行 表单 验证

使用表单身份验证进行模拟

使用 JavaScript 多步骤表单进行联系表单验证

使用 Bootstrap (jQuery) 进行表单验证

使用 $.each 进行表单验证

使用规则集进行 Codeigniter 表单验证