>  기사  >  데이터 베이스  >  SQL 주입 공격으로부터 웹사이트를 보호하는 방법은 무엇입니까?

SQL 주입 공격으로부터 웹사이트를 보호하는 방법은 무엇입니까?

黄舟
黄舟원래의
2017-05-20 17:21:031443검색

SQL 주입 공격으로부터 웹사이트를 보호하는 방법은 무엇입니까?

SQL 주입 공격은 공격자가 사이트 내 합법적인 사용자의 입력 메커니즘을 사용하여 실행을 위해 SQL 코드를 데이터베이스로 보내는 것을 의미합니다. SQL 주입 공격을 방지하는 황금률은 다음과 같습니다. 외부 소스의 데이터 데이터베이스에 도달하기 전에 이스케이프하세요. 이 규칙은 INSERT, UPDATE 문뿐만 아니라 SELECT 쿼리에도 적용됩니다~

스크립트 쿼리에서 미리 컴파일된 문을 사용하면 모든 SQL 주입 공격 문제를 거의 해결할 수 있지만 query() 메서드를 사용하도록 선택하면 그러한 보호 기능은 없습니다. 쿼리에 추가된 사용자 입력은 수동으로 이스케이프되어야 합니다. 코드는 다음과 같습니다.

<?php
    $dbms = "mysql";                                  // 数据库的类型
    $dbName ="php_cn";                                //使用的数据库名称
    $user = "root";                                   //使用的数据库用户名
    $pwd = "root";                                    //使用的数据库密码
    $host = "localhost";                              //使用的主机名称
    $dsn  = "$dbms:host=$host;dbname=$dbName";
    $name =&#39;mr&#39;;
    $name ="&#39;or Name LIKE&#39;%";
    $query="select * from user where username = &#39;".$name."&#39;";//sql语句
try {
    $pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
    $result = $pdo->query($query);    //输出结果集中的数据
    foreach ($result as $row){        //输出结果集中的数据
        ?>
<tr>
    <td bgcolor="#FFFFFF"><div align="center"><?php echo $row[&#39;username&#39;];?></div></td>
</tr>
<?php
    }
}catch (Exception $e){
    echo "ERROR!!".$e->getMessage()."<br>";
}
?>

이 예에서는 SQL 문의 $name 변수가 사용자가 제출한 양식에서 가져온 것으로 가정합니다. 일반적으로 사용자는 다음 SQL 문을 생성하는 "mr"과 같은 명령문을 제출합니다.

select * from user where username = &#39;mr&#39;

이는 스크립트에 문제를 일으키지 않지만 "똑똑한" 공격자는 "'OR Name LIKE를 입력할 수 있습니다. '%', 다음 SQL 문이 생성됩니다.

select * from user where username = &#39;mr&#39;

이는 스크립트에 아무런 문제를 일으키지 않지만, "영리한" 공격자가 "'OR Name LIKE'%"를 입력하여 다음과 같은 결과를 초래할 수 있습니다. 다음 SQL 문:

select * from user where username ="OR Name LIKE&#39;%&#39;

이 입력은 공격자에게 전체 테이블을 열어주며 매우 민감한 데이터인 경우 완전히 노출됩니다. 그렇다면 이 문제를 해결하기 위해 어떤 방법을 사용할 수 있습니까?

해결책

이 문제를 해결하려면 PDO의 quote 메소드를 사용하여 SQL 문자열에 전달된 데이터를 이스케이프할 수 있습니다. SQL 코드를 다음과 같이 수정해야 합니다.

$sql="select * from user where username = &#39;".$pdo->quote($name)."&#39;";

SQL 쿼리에 사용된 모든 데이터를 인용해야 한다는 점을 기억하세요. prepare() 및 Execution() 사용을 고려하지 않는 한 이에 대한 지름길은 없습니다. 행동 양식.

참고:

PDO->query() 메서드를 사용하는 경우 항상 다음을 수행해야 합니다. quote( ) 메소드를 사용하면 사용자의 입력을 참조하므로 "항상 필수"임을 기억하세요.

prepare() 및execute() 메소드를 사용하기로 선택한 경우 바인딩해야 하는 값을 참조할 필요가 없습니다. 사전 컴파일된 SQL(예: 가져오기 데이터베이스 값에 삽입), 드라이버는 사용자를 위해 모든 작업을 수행합니다. 그러나 이 경우 변수를 사전 컴파일된 SQL 문에 바인딩하지 못할 수도 있습니다. 동적 SQL 문을 생성할 때 바인딩할 수 없는 모든 값(예: GROUP BY 절, ORDER BY 또는 테이블 이름)을 인용해야 합니다.

이제 SQL 인젝션 공격으로부터 웹사이트를 보호하는 방법에 대한 솔루션은 모두가 이 섹션에서 익히실 수 있을 것이라 믿습니다~

위 내용은 SQL 주입 공격으로부터 웹사이트를 보호하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.