我有安全功能,但我遇到了问题 我用 - MySQLi
我使用此功能secure
:
function secure ($string) {
$string = htmlspecialchars($string);
$string = strip_tags($string);
$string = stripcslashes($string);
$string = $mysqli -> real_escape_string($string);
return $string;}
在我看来这个问题是一个错误:
致命错误:在
中的非对象上调用成员函数real_escape_string()
谢谢!
答案 0 :(得分:0)
你可以做几件事。也许做类似的事情:
function secure($connection, $string) {
return $connection->real_escape_string(htmlentities(strip_tags(stripcslashes($string))), 3, 'UTF-8');
}
我个人会在安全页面上存储一些内容,例如:
function db(){
return new mysqli(/*arguments here*/);
}
然后执行以下操作:
function secure($string){
$db = db();
$str = $db->real_escape_string(htmlentities(strip_tags(stripcslashes($string))), 3, 'UTF-8');
$db->close();
return $str;
}
显然,这不是JavaScript,所以你有一个范围问题。
答案 1 :(得分:0)
如果你想要你的函数工作,你必须作为参数传递$ mysqli对象
像这样:
function secure ($string,$mysqli) {
$string = htmlspecialchars($string);
$string = strip_tags($string);
$string = stripcslashes($string);
$string = $mysqli -> real_escape_string($string);
return $string;}
我建议你,不要使用这个功能:
1-过度杀人和错误@Dagon的评论。(同意)
2-既然您正在使用mysqli,那么当您使用预准备语句时,为什么要这样做呢? @ barmar的评论。(同意)
3-在放入数据库时不应使用htmlspecialchars(),在渲染@bamar注释时应使用htmlentities()。(同意)
以上是我不使用的主要原因
<小时/> 您可以改为使用Prepare Staments,an example from the manual
/* create a prepared statement */
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?");
/* bind parameters for markers */
$stmt->bind_param("s", $city);
/* execute query */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($district);
/* fetch value */
$stmt->fetch();
printf("%s is in district %s\n", $city, $district);
/* close statement */
$stmt->close();
答案 2 :(得分:0)
为什么要通过这些问题询问如何清理输入,以便从外部数据构建SQL语句? 从外部数据构建SQL语句很危险。
不要浪费你的时间来担心你如何能想出另一个想到“解决方案”的中途,停下来穿上你的大程序员裤子并开始使用准备好的语句和绑定变量。
这是一个很棒的答案,可以帮助您入门:How can I prevent SQL injection in PHP?
您还可以查看http://bobby-tables.com/php了解其他示例。
在我看来,您仍然可以使用Oracle执行预准备语句和绑定变量:http://php.net/manual/en/function.oci-bind-by-name.php或通过PDO http://php.net/manual/en/pdostatement.bindparam.php