1
 1. how to work php sql injection and use in site ?

我的网站登录过程很容易登录任何没有用户名和密码的人。请描述如何安全登录过程。

例子 :

$logindetail = "select * from tablename where username = '".$_REQUEST['username']."' and password = '".$_REQUEST['password']."' ";

$sqlrun = mysql_query($logindetail);

$recordcount = mysql_num_rows($sqlrun); 

在这个登录过程中如何使用 sql 注入?

4

4 回答 4

3

目前尚不清楚您是否要求某人解释如何防止 SQL 注入,或者有人可能如何使用 SQL 注入进入您的站点。

为防止 SQL 注入,请使用参数化查询。这已经在这个问题中得到了很好的解释:How can I prevent SQL injection in PHP?

如果有人意识到您的网站容易受到 SQL 注入攻击,他们可以通过在用户名框中输入任何已知用户名登录您的网站

admin' OR 1=1 -- 

这使得在数据库服务器上执行的 SQL:

"select * from tablename where username = 'admin' OR 1=1 -- and password = '' "

OR 1=1评估为 true 并--注释掉 SQL 字符串的其余部分并阻止密码检查。

我不打算讨论密码散列,因为我认为这是一个小例子。

于 2013-10-18T05:33:21.297 回答
3

使用mysqliPDO预先准备 好的语句来执行查询。mysql 已弃用。
像这样的东西: -

<?php
     $con = new mysqli('host','user','pass','db');
     if(!$con)
       die();
     $stmt = $con->prepare("select * from tablename where username = ? and password =?");
     $stmt->bind_param('ss',$_REQUEST['username'],$_REQUEST['password']);
     $stmt->execute();
     $stmt->close();

这可能是一种更安全的停止 SQL 注入的方法。从这里了解更多信息

于 2013-10-18T05:37:34.387 回答
1

将第一行更改为:

$logindetail = "select * from tablename where username = '".mysql_real_escape_string($_REQUEST['username'])."' and password = '".mysql_real_escape_string($_REQUEST['password'])."' ";
于 2013-10-18T05:24:11.433 回答
1

使用准备好的语句和参数化查询。

可以通过使用 msqli http://php.net/manual/en/book.mysqli.php来实现这一点

快速教程。http://www.phphaven.com/article.php?id=65

示例代码

<?php


// CONNECT TO THE DATABASE
    $DB_NAME = 'DATABASE_NAME';
    $DB_HOST = 'DATABASE_HOST';
    $DB_USER = 'DATABASE_USER';
    $DB_PASS = 'DATABASE_PASSWORD';

    $mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);

    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }

// A QUICK QUERY ON A FAKE USER TABLE
    $query = "SELECT * FROM `users` WHERE `status`='bonkers'";
    $result = $mysqli->query($query) or die($mysqli->error.__LINE__);

// GOING THROUGH THE DATA
    if($result->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            echo stripslashes($row['username']);    
        }
    }
    else {
        echo 'NO RESULTS';  
    }

// CLOSE CONNECTION
    mysqli_close($mysqli);


?>
于 2013-10-18T05:33:24.427 回答