2

在用于 SQL 查询之前,我编写了一个用于清理字符串/变量的简短函数:

function cleanstring($sanitize, $maxlength=10, $minlength=0){
    if(strlen($sanitize) <= $maxlength && strlen($sanitize) >= $minlength){
    $sanitize = substr(mysql_real_escape_string(strip_tags($sanitize)), 0, $maxlength);
}
else{
    include("includes/header.php");
    exit("Error!");
    }

return $sanitize;
}

调用使用:

$variable = cleanstring($_POST['someInput'], 5, 5) 

将定义字符串的长度,使用 real_escape_string 和 strip_tags 清理它,然后使用 substr() 确保返回的数据仍然符合长度标准。

有什么方法可以在不使用 PDO 的情况下改进这种清理功能?

4

2 回答 2

2

我认为你错过了重点(或者说得太过分了)。 每当您将控制字符与数据混合时,都需要一种方法来转义这些控制字符,以便将它们解释为数据。

在网络编程中,有几个领域:

  • SQL(每个数据库不同)
  • 命令外壳
  • URI
  • HTML 属性
  • HTML 内容
  • JavaScript

每个人都需要一种独特的逃生方法。有时有多个级别的转义,例如编码 URI,然后将其编码为href=""属性。

您的功能在技术上是“安全的”,但有点混乱。你不想给用户一个错误而不是默默地截断他们的输入吗?此外,如果有人对...发表评论怎么办When I put <strong> tags around the gadget, it breaks??您的代码将删除<strong>. 但是插入 SQL 是完全安全的<>

我建议您只需使用为上述每个项目创建的方法。

  • MySQL: "'" . mysqli_real_escape_string(...) . "'",可能intval在某些情况下。
  • 命令外壳:escapeshellargI(...)
  • URI:urlencode()
  • HTML 属性:'"' . htmlspecialchars(..., ENT_QUOTES) . '"'
  • HTML 内容:`htmlspecialchars(...)
  • JavaScript:json_encode(...)可能包含在 HTML 编码中,具体取决于上下文。

为方便起见,您可以将其中一些包装成更短的函数:

function QA($val)
{
    return '"' . htmlspecialchars($val, ENT_QUOTES) . '"';
}

ETC...

但要点是 100% 的时间防止数据被读取为控制字符。

于 2013-02-26T20:34:20.247 回答
0

不要strip_tags和不要做mysql_real_excape_string!!!在打印时,您需要考虑是否要使用 或其他方式打印它strip_tagshtmlspecialchars而不是在消毒中。而不是mysql_real_excape_string使用准备好的语句。还可以使用过滤器将字符串清理为电子邮件或其他内容。

于 2013-02-26T20:34:06.723 回答