Php重新实现intval函数,php intval 函数

本文探讨了PHP的intval函数在处理GET输入时存在的安全问题,指出仅检查第一个字符是否为整数的机制可能导致SQL注入漏洞。通过示例代码展示了如何利用intval的特性绕过安全检查,并建议开发者在使用intval进行数据过滤时应结合其他安全措施,如预编译SQL语句,以确保数据库操作的安全性。
摘要由CSDN通过智能技术生成

不论什么类型 假如是数字,便前往数字,假如没有是数字便往归0

正在PHP顶用$_GET['id']的时分就能够这样来一个转换

...太佳了

PHP代码

$id= intval($_GET['id']);

echo intval(42); // 42

echo intval(4.2); // 4

echo intval('42'); // 42

echo intval('+42'); // 42

echo intval('-42'); // -42

echo intval(042); // 34

echo intval('042'); // 42

echo intval(1e10); // 1410065408

echo intval('1e10'); // 1

echo intval(0x1A); // 26

echo intval(42000000); // 42000000

echo intval(420000000000000000000); // 0

echo intval('420000000000000000000'); // 2147483647

echo intval(42, 8); // 42

echo intval('42', 8); // 34

?>

intval最常用的是在程序中功滤入进数据库的变量,将其转换为整型,避免SQL注进攻打的发生

但是使用没有该的话则会止不到检讨的做用,下里便联合一个真例来阐明那个答题

海内某个CMS体系,经由ZEND加稀了,解稀后某白件代码如下:

$id = isset( $_GET['id'] ) ? $_GET['id'] : 0;

if ( intval( $id ) )

{

$sql = "SELECT url FROM ".$tablepre."feed WHERE id={$id} AND uploader='{$SESSION['uid']}'";

代码很简略,获与GET来的id用intval函数断定,假如是整型则带进数据库查询, 新网科技

,望似逻辑上出有什么答题,但实践上那段代码出有止就任何的check做用,为什么呢?瞅如下足原:

$var="20070601";

if (intval($var))

echo "it's safe";

echo '$var='.$var;

echo "
";

$var1="1 union select 1,1,1 from admin";

if (intval($var1))

echo "it's safe too";

echo '$var1='.$var1;

?>

运转以上足原能够望到,两个断定的成果皆是safe的,但实践上只要$var是平安的$var1变质后已经附带的有额定的SQL查询语句了,那么intval是如何判别的呢?这就须要瞅intval函数正在PHP中是如何完成的,代码如下:

PHP_FUNCTION(intval)

{

zval **num, **arg_base;

int base;

switch (ZEND_NUM_ARGS()) {

case 1:

if (zend_get_parameters_ex(1, &num) == FAILURE) {

WRONG_PARAM_COUNT;

}

base = 10;

break;

case 2:

if (zend_get_parameters_ex(2, &num, &arg_base) == FAILURE) {

WRONG_PARAM_COUNT;

}

convert_to_long_ex(arg_base);

base = Z_LVAL_PP(arg_base);

break;

default:

WRONG_PARAM_COUNT;

}

RETVAL_ZVAL(*num, 1, 0);

convert_to_long_base(return_value, base);

}

intval函数只断定参数的第一个字符能否为整型,那样假如搁正在if中,只需知足变质第一个字符为整型,则前往值为ture, 400电话

,所以道用if来判别intval后的变质是没有平安的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值