我正在组建一个网站,(我们已经在客户端使用javascript进行预验证)。但是厌倦了每隔一行编写mysql_real_escape_string。我写了这个类只有两个函数,主要集中在用户输入/ sql中清理数据。我的问题是,有哪些方法可以实现更轻松的输入消毒并提高代码可读性?
<?php
class Safe {
function userinput($string){
$string = strip_tags($string);
$string = htmlspecialchars($string);
return $string;
}
function sql ($string){
$sqlstuff = Array("union", "select", "update", "delete", "outfile", "create");
$string = Safe::str($string);
$string = mysql_escape_string($string);
$string = str_ireplace($sqlstuff, "", $string);
return $string;
}
}
?>
答案 0 :(得分:5)
对不起,这听起来很刺耳,但是你的班级完全被打破了。
htmlspecialchars
来清理输入,它只对转义输出有用。您不需要编码HTML以插入数据库也不需要。仅在向浏览器发送输出时使用htmlspecialchars
htmlspecialchars
将它们单独留下以确保HTML标记被转义而不被浏览器解释mysql_escape_string
或mysql_real_escape_string
,您应该使用PDO。如果您正在编写新网站,绝对没有理由无法正确启动并使用PDO。 做到。再次,抱歉这个答案的严厉语气,但废弃整个事情并使用PDO。这里几乎没有任何可以挽救的东西。
答案 1 :(得分:2)
使用类似的类是个好主意,特别是如果它简化了输入处理。不过我想评论几点:
html
或其他东西。 userinput
听起来含糊不清,歪曲。htmlspecialchars($str, ENT_QUOTES, "UTF-8")
才能完全安全答案 2 :(得分:2)
您还可以使用与PHP捆绑在一起的filter_*函数,并为您提供根据特定过滤规则过滤请求参数的机制。
使用few extra tricks,您甚至可以过滤不同类型数据的数组(感谢erisco!)。
class sanitizer {
public function sanitizeValues($values, $filters) {
$defaultOptions=FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_FLAG_STRIP_LOW | FILTER_NULL_ON_FAILURE;
$filters=(array)$filters;
$values=(array)$values;
foreach ($filters as $key => $filter) {
if($parts=explode('/', $key)){
$v=&$values;
foreach ($parts as $part){
$v=&$v[$part];
}
$filter=(array)$filter;
$filter[1]=isset($filter[1])?$filter[1]:$defaultOptions;
$v=filter_var($v, $filter[0], $filter[1]);
// consider if you really need this here instead of PDO
// $v=mysql_real_escape_string($v);
}
else{
$values[$key]=isset($values[$key]) ? filter_var($values[$key], $filter[0], $filter[1]) : null;
}
}
return $values;
}
}
$manager=sanitizer::sanitizeValues($_GET['manager'], array(
'manager/managerID'=>FILTER_VALIDATE_INT,
'manager/username'=>FILTER_SANITIZE_STRING,
'manager/name'=>FILTER_SANITIZE_STRING,
'manager/email'=>FILTER_SANITIZE_STRING,
'manager/phone'=>FILTER_SANITIZE_STRING,
'manager/bio'=>FILTER_SANITIZE_STRING,
'manager/enabled'=>FILTER_VALIDATE_BOOLEAN,
'manager/password'=>FILTER_SANITIZE_STRING));
这将根据_GET中的'manager'参数生成一个包含所有必需字段的数组,所有值都已过滤,并且可选地进行转义。