防止URL注入

时间:2016-07-12 09:34:31

标签: php wordpress security url

我的网站最近遭到黑客攻击/妥协。通过谷歌,我了解到它是网站注射的受害者。我相信我已经清理并希望保护我的网站,但我正在寻找方法来防止它再次发生。我遇到了一个代码(见下文),想知道它是否会

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."'";

}
}
?>

3 个答案:

答案 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)

您需要了解这一点:

  1. 没有什么是100%安全的。
  2. 您所能做的就是提高您的安全水平 实施不同的安全措施,如过滤用户输入 在使用预准备语句查询数据库之前。
  3. 通过加密使用安全连接进行服务器交互 使用SHA或MD5或其他盐加密的数据。
  4. 在表单中使用验证码来过滤机器人攻击。
  5. 就上述代码而言:

    1. 只是检查请求id是否为整数。
    2. 过滤掉特殊字符然后运行 查询。
    3. 我建议您查看以下链接:

      https://www.owasp.org/index.php/PHP_Top_5

      它将让您深入了解如何在应用程序中实现安全性。