PHP firewall versiunea 1.0

Post Title

Nu am mai scris nimic de mult timp, insa printre altele am facut un mic firewall, inca este incomplet insa se poate dezvolta mai mult, asa ca apelez la voi pentru dezvoltarea codului si pentru a putea acoperi cat mai multe vulnerabilitati, mai jos este codul :

  1.  
  2. <?php
  3.  
  4. /**
  5.  * @Package: Micul-Programator.ro firewall
  6.  * @Author: Marian
  7.  * @$Date: 06/08/2014
  8.  * @Contact: [email protected]
  9.  * @$Rev: 1
  10.  */
  11.  
  12. class Firewall {
  13.  
  14.  
  15. private $_protection = array(
  16. '_ENTITIES' =--> FALSE,
  17. '_XSS' => FALSE,
  18. '_RFI' => FALSE,
  19. '_SQLI' => FALSE,
  20. );
  21.  
  22. private $_detection = array(
  23. 'XSS' => FALSE,
  24. 'RFI' => FALSE,
  25. 'SQLI' => FALSE
  26. );
  27.  
  28. private $_logs = 'logs.txt';
  29.  
  30. /**
  31.   * Constructorul clasei seteaza protectia si detectia vulnerabilitatilor
  32.   * @param array $protection -> lista de vulnerabilitati pentru care clasa ofera protectie
  33.   * @param array $detection -> lista de vulnerabilitati pentru care clasa ofera detectie
  34.   * @return void
  35.   */
  36. public function __construct($protection = array() ,$detection = array()) {
  37.  
  38. if (count($protection)) {
  39.  
  40. foreach ($protection as $key => $val) {
  41.  
  42. if (array_key_exists($key , $this->_protection) && is_bool($val)) {
  43.  
  44. $this->_protection[$key] = $val;
  45. }
  46.  
  47. }
  48. }
  49.  
  50. if (count($detection)) {
  51.  
  52. foreach ($detection as $key => $val) {
  53.  
  54. if (array_key_exists($key , $this->_detection) && is_bool($val)) {
  55.  
  56. $this->_detection[$key] = $val;
  57. }
  58.  
  59. }
  60. }
  61.  
  62.  
  63.  
  64. }
  65.  
  66. /**
  67. * Scrierea logorilor in cazul detectari atacurilor
  68. * @param string -> tipul de atac xss, sqli, rfi
  69. * @return void
  70. */
  71. function write_logs($attack = "XSS") {
  72.  
  73. $mesaj = "======================================================================\n";
  74. $mesaj .= "Tip atac: ".$attack." \n";
  75. $mesaj .= "Data : ". date("Y-m-d H:i:s"). "\n";
  76. $mesaj .= "IP : ".$_SERVER['REMOTE_ADDR']. "\n";
  77. $mesaj .= "Request: ".$_SERVER['REQUEST_URI']."\n";
  78. $mesaj .= "=======================================================================\n";
  79.  
  80. file_put_contents($this->_logs, $mesaj, FILE_APPEND);
  81. }
  82.  
  83. /**
  84. * Fuctia pune in "functiune" mecanismul de protectie impotriva vulnerabilitatilor
  85. * @param null
  86. * @return void
  87. */
  88. public function enableProtection() {
  89.  
  90. foreach ($this->_protection as $key => $val) {
  91.  
  92. if ($val === TRUE) {
  93.  
  94. if (method_exists($this,$key)) {
  95.  
  96. call_user_func(get_class($this)."::".$key);
  97. }
  98. }
  99.  
  100. }
  101.  
  102. }
  103.  
  104. /**
  105. * Fuctia pune in "functiune" mecanismul de detectie a vulnerabilitatilor
  106. * @param null
  107. * @return void
  108. */
  109. public function enableDetection() {
  110.  
  111. foreach ($this->_detection as $key => $val) {
  112.  
  113. if ($val === TRUE) {
  114.  
  115. if (method_exists($this,$key)) {
  116. call_user_func(get_class($this)."::".$key);
  117. }
  118. }
  119.  
  120. }
  121.  
  122. }
  123.  
  124. /**
  125. * Transforma recursiv valorile variabilelor get,post,cookie in entitati html, bineinteles doar ce poate fi transalatat
  126. * @param null
  127. * @return void
  128. */
  129. private function _ENTITIES() {
  130.  
  131. array_walk_recursive($_GET,get_class($this)."::_callHTMLENTITIES");
  132. array_walk_recursive($_POST,get_class($this)."::_callHTMLENTITIES");
  133. array_walk_recursive($_COOKIE,get_class($this)."::_callHTMLENTITIES");
  134.  
  135. }
  136.  
  137. private function _callHTMLENTITIES(&$item, $key) {
  138.  
  139. $item = htmlentities($item, ENT_QUOTES,'utf-8');
  140.  
  141. }
  142.  
  143. /*************************** XSS detection/protection ***************/
  144.  
  145. /**
  146.   * Filtreaza recursiv valorile din get,post,cookie pentru a oferi protectie xss
  147.   * @param null
  148.   * @return void
  149.   */
  150. private function _XSS() {
  151.  
  152. array_walk_recursive($_GET,get_class($this)."::_callXSS");
  153. array_walk_recursive($_POST,get_class($this)."::_callXSS");
  154. array_walk_recursive($_COOKIE,get_class($this)."::_callXSS");
  155.  
  156. }
  157.  
  158. /**
  159. * Detecteaza recursiv un atac xss, in caz de atac scrie log si opreste executarea sciptului
  160. * @param null
  161. * @return void
  162. */
  163.  
  164. private function XSS() {
  165.  
  166. array_walk_recursive($_GET,get_class($this)."::_detectXSS");
  167. array_walk_recursive($_POST,get_class($this)."::_detectXSS");
  168. array_walk_recursive($_COOKIE,get_class($this)."::_detectXSS");
  169.  
  170. }
  171.  
  172. private function _callXSS(&$item, $key) {
  173.  
  174. $item = filter_var($item, FILTER_SANITIZE_STRING);
  175.  
  176. }
  177.  
  178. private function _detectXSS($item, $key) {
  179.  
  180. if ($item != strip_tags($item)) {
  181. $this->write_logs("XSS");
  182. die("Hacking attempt...");
  183. }
  184.  
  185. }
  186.  
  187. /****************************END XSS******************************/
  188.  
  189. /****************SQL INJECTION detection/protection**************/
  190.  
  191. /**
  192.   * Protectie recurisva pe toti parametri get,post si cookie.
  193.   * @param null
  194.   * @return void
  195.   */
  196. private function _SQLI() {
  197.  
  198. array_walk_recursive($_GET,get_class($this)."::_callSQLI");
  199. array_walk_recursive($_POST,get_class($this)."::_callSQLI");
  200. array_walk_recursive($_COOKIE,get_class($this)."::_callSQLI");
  201.  
  202. }
  203. /**
  204.   * Detectie sqli recurisva pe toti parametri get,post si cookie.
  205.   * @param null
  206.   * @return void
  207.   */
  208. private function SQLI() {
  209.  
  210. array_walk_recursive($_GET,get_class($this)."::_detectSQLI");
  211. array_walk_recursive($_POST,get_class($this)."::_detectSQLI");
  212. array_walk_recursive($_COOKIE,get_class($this)."::_detectSQLI");
  213.  
  214. }
  215.  
  216. private function _callSQLI(&$item, $key) {
  217.  
  218. $item = mysql_real_escape_string($item);
  219. }
  220.  
  221. private function _detectSQLI($item, $key) {
  222.  
  223. $sqli = array(
  224. "'",
  225. "\"",
  226. '*/from/*',
  227. '*all*',
  228. '+all+',
  229. ' all ',
  230. '*/insert/*',
  231. '+insert+',
  232. '+into+',
  233. '%20into%20',
  234. '*/into/*',
  235. ' into ',
  236. '*/limit/*',
  237. '+select ',
  238. ' select+',
  239. '*/select/*',
  240. '+select+',
  241. '%20select%20',
  242. ' select ',
  243. '+union+',
  244. '%20union%20',
  245. '*/union/*',
  246. ' union ',
  247. ' union+',
  248. '+union ',
  249. '*/update/*',
  250. '*/where/*',
  251. 'select @@version',
  252. 'select user()',
  253. 'select database()',
  254. 'select @@datadir;',
  255. 'select benchmark',
  256. '+load_file+',
  257. ' load_file ',
  258. '*/load_file/*',
  259. "' or 1=1--",
  260. '" or 1=1--',
  261. "' or 0=0 --",
  262. " --",
  263. "%20--",
  264. );
  265.  
  266. $sqli = str_replace($sqli, '[sqli]', strtolower($item));
  267. if ($sqli != strtolower($item)) {
  268. $this->write_logs("SQL INJECTION");
  269. die("Hacking attempt...");
  270. }
  271. }
  272.  
  273. /*********************** END SQLI *********************************/
  274.  
  275. /*************************RFI detection/protection ****************/
  276.  
  277. /**
  278.   * Protectie recurisva impotriva rfi pe toti parametri get,post si cookie.
  279.   * @param null
  280.   * @return void
  281.   */
  282.  
  283. private function _RFI() {
  284.  
  285. array_walk_recursive($_GET,get_class($this)."::_callRFI");
  286. array_walk_recursive($_POST,get_class($this)."::_callRFI");
  287. array_walk_recursive($_COOKIE,get_class($this)."::_callRFI");
  288.  
  289. }
  290. /**
  291.   * Detectie recurisva rfi pe toti parametri get,post si cookie.
  292.   * @param null
  293.   * @return void
  294.   */
  295. private function RFI() {
  296.  
  297. array_walk_recursive($_GET,get_class($this)."::_detectRFI");
  298. array_walk_recursive($_POST,get_class($this)."::_detectRFI");
  299. array_walk_recursive($_COOKIE,get_class($this)."::_detectRFI");
  300.  
  301. }
  302.  
  303. private function _callRFI(&$item, $key) {
  304.  
  305. if (filter_var($item, FILTER_VALIDATE_URL)) {
  306.  
  307. $item = "";
  308. }
  309.  
  310. }
  311.  
  312. private function _detectRFI(&$item, $key) {
  313.  
  314. if (filter_var($item, FILTER_VALIDATE_URL)) {
  315. $this->write_logs("RFI");
  316. die("Hacking attempt...");
  317. }
  318.  
  319. }
  320.  
  321.  
  322. /************************* END RFI ********************************/
  323.  
  324.  
  325.  
  326.  
  327.  
  328. }
  329.  
  330. ?>

se foloseste astfel :

  1.  
  2. <?php
  3.  
  4. include_once('firewall.php');
  5.  
  6. $protection = array(
  7. '_ENTITIES' =--> TRUE,
  8. '_XSS' => TRUE,
  9. '_RFI' => TRUE,
  10. '_SQLI' => FALSE,
  11. );
  12. $detection = array(
  13. 'XSS' => TRUE,
  14. 'RFI' => TRUE,
  15. 'SQLI' => TRUE
  16. );
  17.  
  18. $obj = new Firewall($protection,$detection);
  19. $obj->enableDetection();
  20. $obj->enableProtection();
  21.  
  22.  
  23. ?>
  24.  

am urcat si pe git codul  : https://github.com/miculprogramator/mpfirewall

Astept sugestii si ajutor din partea voastra pentru a dezvolta acest mini firewall

Autor articol

Ştiinţa fără religie este şchioapă, religia fără ştiinţă este oarbă (Albert Einstein)

Comentarii

Comentariu adaugat de marian
Daca cineva foloseste accest mic firewall este rugat sa posteze aici, sunt si eu curios daca e folosit pana in prezent de cineva, sau daca macar a fost testat.
go to page top marian | 2014-06-11
Comentariu adaugat de marian
Mai este de muncit la el, adica nu e chiar perfect scris, din mai multe puncte de vedere, insa dupa ce o sa facem o baza de date cu vulnerabilitati o sa il rescriu, astfel sa optimizez si cateva chestii de pe acolo, momentan contributia utilizatorilor este importanta

 

O sa apara fregvent comituri noi sa ca urmariti pagina de GitHub 
go to page top marian | 2014-06-08
Comentariu adaugat de GarryOne
Foarte frumos scriptul. Felicitari.
go to page top GarryOne | 2014-06-08

Exista 3 comentarii   

  • 1
Trebuie sa fii logat sa poti lasa un comentariu Autentificare Inregistrare Logare cu Facebook
top