我的网站最近遭到黑客攻击/妥协。通过谷歌,我了解到它是网站注射的受害者。我相信我已经清理并希望保护我的网站,但我正在寻找方法来防止它再次发生。我遇到了一个代码(见下文),想知道它是否会
1)今后是否有防止此类攻击的工作?和
2)我应该在哪里添加此代码,因为我的网站是在WordPress中构建的。
任何帮助甚至更好的代码,任何人都可以提供的将是非常感谢,我是编程新手。
代码:
<?php
if(isset($_REQUEST["id"])){
if(!is_int($_REQUEST["id"])){
//redirect this person back to homepage
} else {
$id_raw = trim(htmlentities($_REQUEST["id"]));
$id_secure = mysql_real_escape_string($id_raw);
$sql = "SELECT * FROM databasetable WHERE id='".$id_secure."'";
}
}
?>
答案 0 :(得分:3)
PDO 是 PHP数据对象的首字母缩写。 PDO是访问数据库的精简,一致的方式。这意味着开发人员可以轻松编写可移植代码。 PDO不是像PearDB那样的抽象层。 PDO更像是使用统一API(应用程序编程接口)的数据访问层。 你基本上有两个选择来实现这个目标:
示例:
$qry = $con->prepare('SELECT * FROM student WHERE name = :name');
$qry->execute(array('name' => $name));
foreach ($qry as $get) {
// do something with $get
}
使用PDO设置数据库
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
DSN基本上是一串选项,告诉PDO使用哪个驱动程序,以及连接详细信息...您可以在此查找PDO MYSQL DSN中的所有选项。
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,$password);
注意:如果收到有关字符集的错误,请确保将charset参数添加到DSN。出于安全原因,将字符集添加到DSN非常重要,您将看到的大多数示例都将其排除在外。请务必包括CHARSET!
您还可以使用setAttribute方法在PDO构造后设置一些属性:
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
注入类型攻击的工作方式是通过某种方式获得一个解释器(数据库)来评估一些应该是数据的东西,就好像它是代码一样。这只有在同一介质中混合代码和数据时才有可能(例如,当您将查询构造为字符串时)。参数化查询通过分别发送代码和数据来工作,因此永远不可能找到一个漏洞这一点。
答案 1 :(得分:2)
SQL注入是使用SQL数据库的应用程序中的一种漏洞。在SQL语句中使用用户输入时会出现此漏洞。
New-Variable -Name NetworkChange -Value ([System.Net.NetworkInformation.NetworkChange])
$NetworkChange
正如您所看到的,用户输入URL变量的值将被分配给变量$ n,然后直接放入SQL语句中。这意味着用户可以编辑SQL语句。
$n = $_GET['user'];
$sql = "SELECT password FROM tbl_login WHERE name = '$n' ";
然后,SQL数据库将接收SQL语句,如下所示:
$name = "admin' OR 1=1 -- ";
$query = "SELECT password FROM tbl_login WHERE name = '$n' ";
为了防止SQL注入,我们必须使用一些名为prepare语句的东西,它使用绑定参数。准备语句不会将变量与SQL字符串组合在一起,因此攻击者无法修改SQL语句。 Prepared Statements将变量与已编译的SQL语句组合在一起,这意味着SQL和变量是分开发送的,变量只是被解释为字符串,而不是SQL语句的一部分。
使用mySQLi准备语句。
使用以下步骤中的方法,您不需要使用任何其他SQL注入过滤技术,例如mysql_real_escape_string()。这是因为使用预准备语句不可能进行传统的SQL注入。
mySQLi SELECT查询。
SELECT password FROM tbl_login WHERE name = 'admin' OR 1=1 -- '
答案 2 :(得分:1)
您需要了解这一点:
就上述代码而言:
我建议您查看以下链接:
https://www.owasp.org/index.php/PHP_Top_5
它将让您深入了解如何在应用程序中实现安全性。