我在下面编写了这个函数来返回可以在PDO语句中使用的$ _POST全局值。如果这是一个很好的方法,我只想要建议。我知道“内爆”部分可能不是很灵活,但我想知道如何改进。任何有关逻辑和改进功能的帮助都深表赞赏。 感谢。
/**
* This function loops through the $_POST global and returns parameters that can be used in
* a PDO statement directly. Note : For this function to work properly the
* PDO::ATTR_EMULATE_PREPARES should be set to "false"
* like so "$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false)".
* @param Array $exclude This is an array of keys in $_POST that you want the function to ignore
* @return Array The function returns an array that can be used as parameters for the PDO statement
*/
function get_params($exclude = array()) {
$keys = array();
$values = array();
$placeholder_keys = array();
$params = array();
foreach ($_POST as $key => $value) {
if(!in_array($key, $exclude)) {
$keys[] = $key;
$placeholder_keys[] = ":" . $key;
if(is_array($value)){
$value = implode(",", $value);
}
$values[] = $value;
}
}
$comma_sep_keys = implode(",", $keys);
$comma_sep_placeholder_keys = implode(",", $placeholder_keys);
$params['keys'] = $keys;
$params['values'] = $values;
$params['placeholder_keys'] = $placeholder_keys;
$params['comma_sep_keys'] = $comma_sep_keys;
$params['comma_sep_placeholder_keys'] = $comma_sep_placeholder_keys;
return $params;
}
答案 0 :(得分:4)
你根本没有消毒钥匙。如果数组元素是:
,该怎么办?array(
"foo = ''; DROP TABLE users; --" => 'baz'
)
这使您对SQL注入持开放态度。您将保留值,但作为回报,您将盲目地将未经过处理的密钥连接到您的查询中。
您还将数组值插入单个字符串中;你真的想把它们作为单个值"foo,bar,baz"
插入它们原来是一个数组吗?
答案 1 :(得分:1)
如果不清楚(并且因为这是我认为的第一件事),将其扩展为deceze,您的用户可以将表单更改为:
<input name = "foo = ''; DROP TABLE users; --" value = 'baz'>
此外,您很容易受到XSS攻击。如果有人输入此值,那该怎么办:
<SCRIPT SRC=http://ha.ckers.org/xss.js></SCRIPT>
然后,进入可以读取该用户输入的页面中的每个人(最重要的是,您)将加载xss.js
。这非常危险,我建议严格的消毒规则。编辑:通常你应该使用htmlentities(),但只能在输出数据时使用它们,这可以在this question in SO中学习。但是,如果你接受html,那么一个好的库就是HTML Purifier。