使用 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.45e6
、0xf4c3b00c
、0b10100111001
。 ctype_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 进行表单验证的主要内容,如果未能解决你的问题,请参考以下文章