php - 是否可以在该死的易受攻击的 Web 应用程序上进行 SQL 注入(inject)(高级)?

标签 php mysql

我在谷歌上搜索过如何绕过以下内容(来自 DVWA 的高级别安全性):

$id = $_GET['id']; 
    $id = stripslashes($id); 
    $id = mysql_real_escape_string($id); 

    if (is_numeric($id)){ 

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); 

    $num = mysql_numrows($result); 

    $i=0; 

    while ($i < $num) { 

        $first = mysql_result($result,$i,"first_name"); 
        $last = mysql_result($result,$i,"last_name"); 

        echo '<pre>'; 
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; 
        echo '</pre>'; 

        $i++; 
    } 
} 

有可能破解吗?

对于那些不熟悉 DVWA 的人,这里有一个关于它的 youtube 视频: http://www.youtube.com/watch?v=oMV0JZVxvdQ

此外,我的另一个担忧是中等水平。它确实有 mysql_real_escape_string() 工作,但是当您从低级别使用相同的 SQL 注入(inject)并删除引号时,它会绕过保护。这是为什么?为什么绕过 mysql_real_escape string 这么容易?

Medium级别的代码(精简版)是这样的:

   $id = $_GET['id']; 
    $id = mysql_real_escape_string($id); 
    $getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";

我想使用 PDO,因为它可能更安全。请让我知道您对此的看法。

非常感谢。

最佳答案

添加 is_numeric 不会使这成为一个很可能的全面的 sql 攻击,但是 is_numeric 并不是很准确:

is_numeric('0xdeadbeef') // true
is_numeric('10e3') // true

使用过滤器可能更好:

if (false !== ($id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT))) {
}

关于php - 是否可以在该死的易受攻击的 Web 应用程序上进行 SQL 注入(inject)(高级)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10809665/

相关文章:

php - 使用php触发另一个php脚本,然后忽略

php - PHP 查询中的 DBCC CHECKIDENT 错误

mysql - Show id 即使结果是空的?

php - 如何在 mongodb && php 中首先返回具有特定值的结果

javascript - 如何解析事件的文本(即今晚 8 点见我)?

php - 如何在 php 中将 ASCII 转换为 UTF-8

php - 根据用户的 IP 将纬度和经度填充到数据库中

mysql - 重复key异常如何No-op?

mysql - 在 MySQL 中设置到期日期的值

mysql - MySql 如何求和然后删除重复字段?