首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止SQL注入

防止SQL注入
EN

Stack Overflow用户
提问于 2012-07-24 08:26:45
回答 4查看 424关注 0票数 3

我正在尝试学习php,并想使用一个函数来保护免受SQL注入!但不知何故,格式记录我的数据库中包含任何特殊字符的每个数据,如'"=)/()/*/

我的filter函数:

代码语言:javascript
复制
function filter($data) {
    $data = trim(htmlentities(strip_tags($data)));

    if (get_magic_quotes_gpc())
        $data = stripslashes($data);

    $data = mysql_real_escape_string($data);

    return $data;
}

注册页面以获取发布数据:

代码语言:javascript
复制
foreach($_POST as $key => $value) {
    $data[$key] = filter($value);
}

然后我尝试特殊的字符和形式保存它们!我做错了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-07-24 08:29:40

如果您想防止SQL注入,最好的方法是使用PDO和准备好的查询,其中所有用户提供的数据都通过execute()传递,如下所示:

代码语言:javascript
复制
$stmt = $pdo->prepare("INSERT INTO foo (a_column, b_column) VALUES (:a, :b)");
$stmt->execute(array(':a' => $a, ':b' => $b));

您不必对$a$b执行任何操作;无论您使用的是哪个数据库,PDO都会以正确的方式绑定参数。

票数 4
EN

Stack Overflow用户

发布于 2012-07-24 08:31:49

呃..。防止SQL注入的要点是继续允许用户键入他们喜欢的任何内容,而不会将服务器或其他用户置于危险之中。htmlspecialchars是一个很好的起点,因为它接收看起来像超文本标记语言标记的东西,并将它们呈现出来。虽然最新版本的stripslashes去掉了魔术引号,但您使用的PHP很好。mysql_real_escape_string允许您以字符串的形式在数据库中插入任何内容,并且具有合理的安全性。

因此,您的过滤函数应该如下所示:

代码语言:javascript
复制
function filter($data) {
    if( get_magic_quotes_gpc()) $data = stripslashes($data);
    return trim(mysql_real_escape_string(htmlspecialchars($data));
}

现在,如果您实际上需要一个过滤器,就像在只允许某些字符的过滤器中一样,使用一个正则表达式函数,比如preg_match

票数 2
EN

Stack Overflow用户

发布于 2012-07-24 08:31:26

停止使用mysql_*函数,因为它们已被弃用。请使用PHP database objects (PDO),因为PDO允许参数绑定,这可以保护您免受sql注入的影响。

您可以阅读《使用PDO here》。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11622462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档