10/10/2018, 09:46

[help] Fix sql injection (php & mysql)

Đây là file function.php
PHP Code:
function menu($p,$loai){
 
$i0;
 
$result ';    
    
$sql "SELECT cate_id,cate_name,cate_idp FROM  tbl_category where cate_idp = 0 order by cate_id asc ";
    
$rs dbQuery($sql);
    if (
dbNumRows($rs) >0){
        while (
$row dbFetchAssoc($rs)){
        
$i++;
            
$result .= '
            
                  <tr>
                    <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
                <tr>
            <td><table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
            <td class="boxLeftTitleLeft">&nbsp;</td>
            <td class="boxLeftTitleMiddle">'
.$row***91;'cate_name'***93;.'   </td>
            <td class="boxLeftTitleRight">&nbsp;</td>
        </tr>
              <tr>
              <td class="boxLeftLeft"></td>
              <td class="boxLeftTable" align="left"><table cellspacing="0" cellpadding="1" width="100%" border="0">
                    
                  <tr>
                    <td width="5%"></td>
                <td >'
;
                
$result .= ' <table border="0" width="100%" cellspacing="0" cellpadding="0" >
                      <tr>
                      <td width="100%" >
                        <table border="0" width="100%" cellspacing="0" cellpadding="0" >'
;
        
$sql 'SELECT cate_id,cate_name,cate_idp FROM  tbl_category where cate_idp ='.$row***91;'cate_id'***93;.' order by cate_id asc';
        
$rs1 dbQuery($sql);
        if (
dbNumRows($rs1) >0){    
            while (
$row1 dbFetchAssoc($rs1)){
            if (
$loai == $row1***91;'cate_id'***93;) {
            
$sty "";
            
$b "<b>";
            
$b1 "</b>";
             }
            else{
            
$sty ="";
            
$b "";
            
$b1 "";
            }
    
             
$result .= ' <tr '.$sty.'>
                      <td width="100%" >'
;
        
                
$result .= '
                <img src="images/image28.jpg" width="10" height="7" /><a href="?module=sanpham&pcat='
.$i.'&loai='.$row1***91;'cate_id'***93;.'" target="_self" ><span style='color:#3F425F' onMouseOver=change(this,'#448AD2') onMouseOut=rechange(this,'#3F425F') >
                '
.$b.'.$row1***91;'cate_name'***93;.'.$b1.'</span></a>
                </td></tr>'
;
             }   
        }
                        
          
$result .='
          </table>
           </td>
                      </tr>
                    </table></td>
                    <tr>
                    <td height="1" class="dot" colspan="2"></td>
                </tr>
                  </tr>
                  
                  
                  
                  
                  
                </table>    </td>
                 <td class="boxLeftRight"></td>
              </tr>
             <tr>
            <td class="boxLeftEndLeft"></td>
            <td class="boxLeftEndMiddle"></td>
            <td class="boxLeftEndRight"></td>
        </tr>
            </table></td>
            
          </tr>
                   </table></td>
                  </tr>'
;
            
            
            
        }
    }
    return 
$result;    

Còn đây là file ghi ra kết quả
PHP Code:
<table width="100%" border="0" cellspacing="0" cellpadding="0" >
               
                <?php 
                $p 
= (isset($_GET***91;'pcat'***93;) && $_GET***91;'pcat'***93; != ') ? $_GET***91;'pcat'***93; : ';
                
$loai  = (isset($_GET***91;'loai'***93;) && $_GET***91;'loai'***93; != ') ? $_GET***91;'loai'***93; : ';
                  echo 
menu($p,$loai);
                
?>    

          <tr>
            <td height="1"></td>
          </tr>
Khi em thêm dấu nháy ' vào thì phát sinh lỗi sql injection. Mấy bác giúp em fix nó với. Thanks.
vtoday viết 11:49 ngày 10/10/2018
intval($_GET[])
Hạn chết đc phần nào
vvthong viết 11:47 ngày 10/10/2018
Bạn thử kiểm tra 2 biến $p và $loai trước khi nhập vào coi, bạn có thể dùng

intval($var), hoặc ép kiểu cho biến dạng (int)$var
vngreetings viết 11:58 ngày 10/10/2018
Vẫn ko ăn thua các bác ạ. Code viết kiểu này khó fix wá hix
mitdacqn viết 11:50 ngày 10/10/2018
Bạn dùng hàm mysql_real_escape_string() để xử lý các biến trước khi đưa vào câu lệnh truy vấn nhé.
rootkit viết 11:48 ngày 10/10/2018
Được gửi bởi mitdacqn
Bạn dùng hàm mysql_real_escape_string() để xử lý các biến trước khi đưa vào câu lệnh truy vấn nhé.
Câu trả lời hay nhất
vngreetings viết 12:00 ngày 10/10/2018
các bác có thể hướng dẫn em viết lại code trên được ko ?
suutamcongnghe viết 11:56 ngày 10/10/2018
Với module trên, nếu bạn truyền giá trị có dấu ' thì nó lỗi thôi chứ chưa gọi là sql injection vì bạn có đem biến đó truyền vào câu truy vấn sql đâu mà sql injection.

Muốn filter sql injection thì cũng dễ thôi: viết 1 module filter các dữ liệu truyền vào. Cách đơn giản nhất là replace dấu ' bằng dấu '' là xong (vì cơ bản của sql injection là phải có dấu ' để đóng 1 câu sql hiện tại và truyền thêm 1 câu sql mới vào.
Bài liên quan
0