我正在处理一个需要通过表单将数据发送到数据库的应用程序。 我已经开发了一个输入测试类来获得干净的输入。 这是我的代码:
class test
{
public static function inputTest($inputPar)
{
$con=mysqli_connect("localhost","****","*****","*******");
// Check connection
if (mysqli_connect_errno()) {
return "Failed to connect to MySQL: " . mysqli_connect_error();
}
$text=htmlspecialchars($inputPar);
$text0=trim($text);
$text1=stripcslashes($text0);
$text2= strip_tags($text1);
$text3 = str_replace("’","'", $text2);
$text4=mysql_real_escape_string($text3);
mysqli_close($con);
return $text4;
}
}
当我尝试使用它时,一切都有效,除了最后$text4=mysql_real_escape_string($text3);
只是每次都给我发回一个空字符串。
我刚刚将所有应用程序转换为新的PDO驱动程序(不要介意这个类中的mysqli驱动程序,它只是一个让它工作的快速示例),并且我读到现在没有必要进行某些控制。所以我要问哪个控件对于具有良好的安全性仍然是强制性的。
Php版本是5.5.9。
答案 0 :(得分:2)
您不能将ext / mysql函数与ext / mysqli连接一起使用。您必须使用其中一个进行连接和转义。
等效的PDO方法是PDO::quote(),但请注意,这会在字符串的每一端添加单引号,这与旧的mysql扩展的转义字符串函数不同。
所有这些都没有实际意义,因为如果您使用预准备语句并使用查询参数将变量添加到查询中,则无需清理输入。事实上,如果你将它们作为查询参数传递,你一定不能转义字符串,因为你会在你不想要它们的数据库中插入文字反斜杠。
在这里查看了很多很好的例子和讨论:How can I prevent SQL-injection in PHP?
您正在使用的所有其他“清理”功能也是不必要的,至少为了SQL注入防御的目的。这些功能不仅仅是“让它更安全”,具有累积效应。它们各自都有特定的用途,简单地将它们一起使用是天真的。
就像你有一个木工项目,你将水密,污渍,透明涂层和三种颜色的涂料涂在同一个表面上。他们每个人都很好,但是一起使用它们表明你不知道它们是什么。
您可能希望查看我的演示文稿SQL Injection Myths and Fallacies,或者观看我向旧金山MySQL用户组发送该演示文稿:https://www.youtube.com/watch?v=o4dJ7hdA8fs或我为Percona录制的免费网络研讨会:http://www.percona.com/webinars/2012-07-25-sql-injection-myths-and-fallacies < / p>