php – 安全地使用预准备语句来查询数据库
发布时间:2020-12-13 17:02:33 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试编写一个在允许的查询中具有多种功能的函数,但也可以安全地注入.下面的代码按原样抛出一个错误,但如果我使用’name’而不是’:field’运行它,它可以正常工作. $field = "name";$value = "joe";function selectquery($field,$value) { global $dbc
我正在尝试编写一个在允许的查询中具有多种功能的函数,但也可以安全地注入.下面的代码按原样抛出一个错误,但如果我使用’name’而不是’:field’运行它,它可以正常工作.
$field = "name"; $value = "joe"; function selectquery($field,$value) { global $dbcon; $select = $dbcon->prepare('SELECT * FROM tester1 WHERE :field = :value'); if($select->execute(array(':field' => $field,':value' => $value))); { $row = $select->fetch(); for ($i=0; $i<3; $i++) { echo $row[$i]."n"; } } } 如何在不允许注入攻击的情况下允许更改表/字段/值? mysql_real_escape_string()似乎有点像倒退了一步.有任何想法吗? 解决方法
我可能弄错了,但我不相信你可以在PDO中提供字段作为参数.
为什么不将它指定为函数的参数?与用户提供的数据不同,字段是有限的,定义良好且不经常更改.如在 selectquery('name',$value); 并有你的查询 $field = "name"; $value = "joe"; function selectquery($field,$value) { global $dbcon; $select=$dbcon->prepare("SELECT * FROM tester1 WHERE $field = :value"); if($select->execute(array(':value' => $value))); //etcetera 由于您自己为函数调用提供字段名称,因此除非您担心自己会使用SQL注入攻击自己,否则这是安全的. 如果由于某些奇怪的原因,该字段的名称来自用户输入,您可以创建一个允许字段数组.这样,您就可以安全地进行注射,因为这些值只能来自您的数组.我不知道为什么字段名称来自用户输入,因此不受信任,除非您正在制作API?另外,可能有更好的方法来实现目标. 无论如何,这将是一个潜在的解决方案,使用白名单表名: $field = "name"; $value = "joe"; $allowed_fields=array('name','other_name','sandwich'); function selectquery($field_name,$value) { global $dbcon,$allowed_fields; if(!in_array($field_name,$allowed_fields)){ return false; } else{ $field=$field_name; } $select=$dbcon->prepare("SELECT * FROM tester1 WHERE $field = :value"); if($select->execute(array(':value' => $value))); //etcetera (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |