【问题标题】:Using is_numeric for form validation使用 is_numeric 进行表单验证
【发布时间】: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;
}

【问题讨论】:

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

标签: php validation isnumeric


【解决方案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 的人的查询将被转义,并且不会造成任何损害。
  • 对。我实际上不会与数据库交互。所以,我认为使用我上面提出的解决方案应该很安全。感谢您的回复。
猜你喜欢
  • 2011-07-26
  • 1970-01-01
  • 2018-05-11
  • 2015-06-25
  • 2017-02-04
  • 2015-07-31
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多