哪些是保护输入免受sql注入的最佳php函数以及如何使用它们? [复制]

Posted

技术标签:

【中文标题】哪些是保护输入免受sql注入的最佳php函数以及如何使用它们? [复制]【英文标题】:Which are the best php functions to protect the input from sql Injection and how to use them? [duplicate] 【发布时间】:2011-11-12 13:56:41 【问题描述】:

可能重复:Best way to stop SQL Injection in phpmysql injection protection and vulnerability signs using PHP

嘿,我问了一个关于我的代码是否容易受到 sql 注入的问题 代码是这样的:

$searchData = $_POST['searchData'];

$searchResult = mysql_query("SELECT * FROM Songs WHERE songname LIKE '$searchData%'");

回显 $searchResult;

是的,每个人都回答说是......但我想要一些额外的帮助来了解如何保护这种输入免受 sql 注入。 我读到了 mysql_real_escpape_string addlashes 等。但我不知道哪个是最好的? 我应该将它们结合起来......或者我应该如何构建我的代码来保护输入 任何帮助我提供最佳解决方案的人都会非常感激。

【问题讨论】:

【参考方案1】:

最好的办法是完全不要逃避转义;使用绑定参数。参见例如PDO 上的 PHP 手册。

一个例子:

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");

$stuff = array('one', 1);
$stmt->execute($stuff);

$stuff = array('two', 2);
$stmt->execute($stuff);    
?>

【讨论】:

这不是一个说明性的例子,它是一个威慑的例子。位置参数并通过execute(array(..)) 传递它们对新手更友好。 (不投反对票。也不投赞成票。) @mario:公平点。我已经对其进行了修改,以显示一个使用未命名参数的示例。【参考方案2】:

我强烈推荐 Chris Shiflett(O'Reilly 着)的一本名为 Essential PHP Security 的短书,因为您所问的问题需要涵盖许多方面。 SQL 注入保护从 html 一直到数据库,中间有几个步骤,以确保您的数据免受注入。

【讨论】:

【参考方案3】:

简答:mysql_real_escape_string

更长的答案:准备好的语句(使用 PDO 或 MySQLi)

更长的答案:如果可能,您应该使用带有绑定参数的准备好的语句(正如 Oli Charlesworth 所说),但是,第二好的选择是使用特定于特定 RDBMS 的转义机制。在这种情况下,您将使用 mysql_real_escape_string 而不是添加斜杠。 mysql_real_escape_string 知道addlashes 不知道的一些事情。 addlashes 是一个美化的 str_replace ' with \'。 mysql_real_escape_string 是 MySQL 客户端库的 mysql_real_escape_string 函数的挂钩。它知道服务器上的一些设置(因此有它的连接参数),它比添加斜杠更安全。

绑定参数仍然更安全。尽管 mysql_real_escape_string 对连接等了解很多,但很多因素都会影响它的安全性。例如,字符集和编码可能难以处理。绑定参数有不同的操作方法,它们不会像普通查询那样进行转义。因此,它们更安全,因为在字符编码等方面出错的空间更小。

【讨论】:

我不想做谁知道我的应用程序会发生什么……我只是从框中输入输入,将其与数据库数据匹配并显示匹配的结果……只是一个实时搜索。我想我会坚持使用 mysql_real_escpape_string 和一些用于 html 标签的正则表达式等等。 绑定参数不是关于在你的应用程序中做谁知道什么。它们是关于良好实践和可能的最佳安全性的。很有可能, mysql_real_escape_string 足以满足您的需要;但是,准备好的语句在其他情况下也有好处,就像使用 PDO 一样。 (我从不使用特定于 RDBMS 的函数。如果我不使用 ORM,我会使用 PDO。)无论如何,正如我所说,真正的转义字符串可能就足够了,但你仍然应该记住准备好的语句。此外,您应该使用 htmlentities,而不是使用正则表达式处理 HTML。 (空间不足,继续……)或者你可以使用striptags。只有在需要混合允许的 HTML 和不允许的 HTML 时,才应该删除 HTML 而不是在输出期间转义它。 (过于简化,但通常是正确的。) 想了解更多关于 pdo 的信息,非常感谢

以上是关于哪些是保护输入免受sql注入的最佳php函数以及如何使用它们? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中使用准备好的语句/存储过程时如何保护自己免受 SQL 注入?

Pipy:保护 Kubernetes 上的应用程序免受 SQL 注入和 XSS 攻击

我是不是足够保护我的网站免受 sql 注入?

如何保护此代码免受 SQL 注入?有点迷茫

如何保护加载数据本地infile更新查询免受sql注入

php防止sql注入漏洞都有哪些函数