is_numeric() 是否意味着 var 对于 MySQL 来说是安全的?
希望问题说明了一切,如果我检查一个变量对于 is_numeric() 返回 true,是否可以直接放入 MySQL 查询中,或者我是否需要应用标准转义?我在想空字符、溢出漏洞之类的东西。
一个不明确的例子是:
if(is_numeric($_GET['user_id'])) {
mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']);
}
MySQL 中的数据类型是 INT()。
Question says it all hopefully, if I check a variable returns true for is_numeric(), is it ok to put directly into the MySQL query, or do I need to apply standard escaping? I'm thinking null character, overflow exploits and stuff.
An ambiguous example would be:
if(is_numeric($_GET['user_id'])) {
mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']);
}
The datatype in MySQL is INT().
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我认为最安全的方法是将 user_id 转换为整数,如果无效则返回 0。
The safest way in my opinion is to convert the user_id to an integer, if it's invalid it will return 0.
考虑到“10e3”
is_numeric
,不。如果您想要数字(例如仅数字),则必须检查
ctype_digit
(对于0123
这样的数字,这仍然会破坏 SQL)或将数字转换为int
或浮动
。如果数字可以是所有数字以外的数字,则需要应用 SQL 安全转义和引用。Considering that "10e3"
is_numeric
, no.If you want numbers (as in, only digits), you'll have to check for
ctype_digit
(which would still break SQL for numbers like0123
) or cast the number to anint
orfloat
. If it's acceptable for the number to be something other than all digits, you'll need to apply the SQL safe escaping and quoting.来自 http://php.net/manual/en/function.is-numeric。 php:
From http://php.net/manual/en/function.is-numeric.php:
因为程序必须为不存在的
id
的变体做好准备,所以这一行应该足够了:无论我们在
sprintf
中传递的不是十进制数字,都将被转换到十进制。零(〜错误输入)具有与不存在 id 相同的状态。保存条件并声明额外变量。
Because the programm must be ready for variant for no-existing
id
this single row should be enough:Whatever what will not be a decimal number we pass inside the
sprintf
will be turned to decimal. The zero (~ bad input) has the same state as no existing id.Saving condition and declaring extra variable.