折雨的天空

博客介绍:本博客当前共有文章【968】篇,总阅读量【5,158,664】次,第一篇博客发表于【2011年04月06日 10时34分】,距今已【4978】天,感谢您的使用!

您的位置:折雨的天空 >php开发> 记录点防SQL注入有用的代码,后面要用

记录点防SQL注入有用的代码,后面要用

作者:eechen
链接:https://www.zhihu.com/question/20076383/answer/149180990
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

<?php
//id IN ($ids) 占位符生成
function app_place_holders(array $params) {
	//http://php.net/manual/zh/pdostatement.execute.php
	return implode(',', array_fill(0, count($params), '?'));
}

// var_export(app_in_pdo(array(1, 3, 5)));
function app_in_pdo(array $ids) {
	global $app;
	$db = app_db();
	$table = $app['db_prefix'].'post';
	$place_holders = app_place_holders($ids);
	$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
	$stmt = $db->prepare($sql);
	$stmt->execute($ids); //所有id都当做字符串处理,值传递.
	return $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// var_export(app_in_mysqli(array(1, 3, 5))); 要求使用PHP内置的mysqlnd驱动
function app_in_mysqli(array $ids) {
	global $app;
	$db = app_mysql();
	$table = $app['db_prefix'].'post';
	$place_holders = app_place_holders($ids);
	$sql = "SELECT * FROM `{$table}` WHERE `id` IN ({$place_holders})";
	$stmt = $db->prepare($sql);
	//MySQLi自动化"引用绑定"参数(因为mysqli的execute不像pdo的execute支持参数数组传递,所以显得麻烦些)
	$params = array_merge(array(str_repeat('s', count($ids))), $ids); //array('sss', 1, 3, 5)
	foreach($params as $k => $v) { $params[$k] = &$params[$k]; } //因为bind_param要求传递引用.
	call_user_func_array(array($stmt, 'bind_param'), $params); //相当于$stmt->bind_param('sss', $ids[0], $ids[1], $ids[2]);
	$stmt->execute();
	return $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
}


估计后面的开发要用到,或者要用类似的思想,所以先记录一下。

原文地址:


https://www.zhihu.com/question/20076383

------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------

转载请注明本文标题和链接:《记录点防SQL注入有用的代码,后面要用

奖励一下

取消

分享不易,烦请有多多打赏,如您也困难,点击右边关闭即可!

扫码支持
扫码打赏,5元,10元,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

-秒后自动关闭,如已打赏,或者不愿打赏,请点击右上角关闭图标。

发表评论

路人甲 表情
看不清楚?点图切换