2015-06-10 4 views
1

У меня проблема, которую я не понимаю. Я хочу создать php-скрипт, который заполнит некоторые таблицы sql из Active Directory.SQL-инъекция из Active Directory

Вот часть моего кода: $result=ldap_list($connect, "OU=PROFS,".$base_dnref, "(ou=*)");

$res = ldap_get_entries($connect, $result); 

for ($i=0; $i < $res["count"]; $i++) { 
$result2=ldap_list($connect, "OU=".$res[$i]["ou"][0].",OU=PROFS,".$base_dnref, "(cn=*)"); 
$res2 = ldap_get_entries($connect, $result2); 
for($j=0;$j<$res2["count"];$j++){ 

    $insert=$db->query("INSERT INTO PROFESSEURS(NOM) VALUES ('".$res2[$j]["cn"][0]."')"); 
    $insert->fetch(); 
} 
} 




$result=ldap_list($connect, "OU=ELEVES,".$base_dnref, "(ou=*)"); 

$res = ldap_get_entries($connect, $result); 

for ($z=0; $z < $res["count"]; $z++) { 

$insert=$db->query("INSERT INTO CLASSE(NUMERO) VALUES ('".strval($res[$z]["ou"][0])."')"); 
$insert->fetch(); 

$result2=ldap_list($connect, "OU=".$res[$z]["ou"][0].",OU=ELEVES,".$base_dnref, "(cn=*)"); 
$res2 = ldap_get_entries($connect, $result2); 

for($y=0;$y<$res2["count"];$y++){ 

    $insert=$db->query("INSERT INTO ELEVE(NOM) VALUES ('".$res2[$y]["cn"][0]."')"); 
    $insert->fetch(); 

} 
} 



} 
catch (PDOException $e) { 
    print 'Exception : ' . $e->getMessage(); 
}` 

Дело в том, что первый двойной for работает отлично, но второй не делает. Однако я использовал тот же синтаксис. Ошибка: «Исключение: SQLSTATE [HY000]: общая ошибка».

Дополнительно, запрос $insert=$db->query("INSERT INTO CLASSE(NUMERO) VALUES ('".strval($res[$z]["ou"][0])."')"); работает нормально, но только с половиной данных Active Directory, а другой нет. Я уверен, что проблема не связана с LDAP-контуром, для этого я использую LDAPExplorerTool.

Не могли бы вы помочь мне, пожалуйста?

ответ

0

Пожалуйста, замените ниже код с вашими:

$res = ldap_get_entries($connect, $result); 

for ($i=0; $i < $res["count"]; $i++) { 
$result2=ldap_list($connect, "OU=".$res[$i]["ou"][0].",OU=PROFS,".$base_dnref, "(cn=*)"); 
$res2 = ldap_get_entries($connect, $result2); 
     for($j=0;$j<$res2["count"];$j++){ 
       $NOM = $res2[$j]["cn"][0];//Store value into variable for further use... 
      $insert=$db->query("INSERT INTO PROFESSEURS(NOM) VALUES ('".$NOM."')"); 
      $insert->fetch(); 
     } 
} 

$result=ldap_list($connect, "OU=ELEVES,".$base_dnref, "(ou=*)"); 

$res = ldap_get_entries($connect, $result); 

for ($z=0; $z < $res["count"]; $z++) { 
     $NUMERO = strval($res[$z]["ou"][0]);//Store value into variable for further use... 
     $insert=$db->query("INSERT INTO CLASSE(NUMERO) VALUES ('".$NUMERO."')"); 
     $insert->fetch(); 

     $result2=ldap_list($connect, "OU=".$res[$z]["ou"][0].",OU=ELEVES,".$base_dnref, "(cn=*)"); 
     $res2 = ldap_get_entries($connect, $result2); 

     for($y=0;$y<$res2["count"];$y++){ 
       $NOM = $res2[$y]["cn"][0];//Store value into variable for further use... 
      $insert=$db->query("INSERT INTO ELEVE(NOM) VALUES ('".$res2[$y]["cn"][0]."')"); 


      $insert->fetch(); 

     } 
} 

Я сделал некоторые незначительные изменения, где у меня есть сомнения. Я предлагаю использовать инструкцию PDO, потому что старый теперь обесценивается.

Сообщите мне, если вы все еще сталкиваетесь с ошибкой, мы можем развернуть его, чтобы решить эту проблему.

Спасибо!

+0

На моем браузере, ваш скрипт сделать "Exception: SQLSTATE [HY000]: Общая ошибка". Только одна строка заполняется в базе данных идентификатором 163, я нахожу это довольно странным. – arkodath

+0

Можете ли вы прокомментировать это: $ insert-> fetch(); Если это не требуется. Кроме того, я не сталкиваюсь с «Исключение: SQLSTATE [HY000]: общая ошибка» в моей системе. Дайте мне знать, если любые изменения. –

+0

Я сделал, но при запуске скрипта появляется такая же ошибка, и заполняется только таблица PROFESSEURS. Даже если есть ошибка, код, который вы предлагаете, прежде чем заполнять таблицу CLASSE, я считаю это слишком случайным, я теряюсь ... – arkodath

0

Я решил проблему. Он исходил из синтаксиса запросов. Я заменяю:

$insert=$db->query("INSERT INTO ELEVE(NOM) VALUES ('".$res2[$y]["cn"][0]."')"); $insert->fetch();

по: $insert=$db->exec('INSERT INTO ELEVE(NOM) VALUES ("'.$res2[$y]["cn"][0].'")');

Так много времени для этого ...