Сигурен код в php

STaNiMiR

Registered
Искам да отворя тема как пишем сигурен код. Тук може да споделите разни хватки как да си направи сайтовете сигурни и трудни за хакване. Какви са най-честите грешки и т.н ...

Идеята ми е следната искам да си направя съдържанито на страниците да ми е в базата данни и се замислих за SQL Injection(може ли да се хакне). Потърсих в нета и намерих следното решение
<?php
function make_safe($variable)
{
$variable = addslashes(trim($variable));
return $variable;
}
$page = make_safe($_GET['page']);
$lang = make_safe($_GET['lang']);
if(isset($page)&& isset($lang))
{
chars="SET CHARACTER SET cp1251";mysql_query($chars);
$queryPages = "SELECT * FROM Pages WHERE Page = '".$page."' AND Lang ='".$lang."' ";
$resultPages = mysql_query($queryPages);

$content = mysql_result($resultPages, 0,"content");
}
echo $content;

?>

Ако има те Възражения и препоръки моля пишете!!!

Източник
 
ето когато всичко е в цифри в бара как става, примерно по id

Код:
<?php 

$server = "localhost"; 
$dbusername = "ime"; 
$dbpassword = "parola"; 
$db_name = "bazaime"; 

$id=$_GET['id'];
if(ereg("^[0-9]+$",$id))
	{
	mysql_connect($server, $dbusername, $dbpassword)or die("Сайтът не може да се свърже към базата данни"); 
	mysql_select_db($db_name) or die("Грешна база данни"); 
	$query = " SELECT * FROM text WHERE id='$id'"; 
	$result = mysql_query($query) or die('Error, query failed'); 
	$row = mysql_numrows($result); 

	while($row = mysql_fetch_array($result)) 
		{ 
		$ime=$row['ime']; 
		echo $ime."<br />"; 
		} 
	}
else
{
echo die("Опит за хак");
}
?>
 
Ето ти Анти-SQl Injection
Код:
<?php

// Анти-SQL Injection
function check_inject()
  {
    $badchars = array(";","'","*","/"," \ ","DROP", "SELECT", "UPDATE", "DELETE", "drop", "select", "update", "delete", "WHERE", "where", "-1", "-2", "-3","-4", "-5", "-6", "-7", "-8", "-9",);

    foreach($_POST as $value)
    {
	$value = clean_variable($value);

	if(in_array($value, $badchars))
      {
        die("SQL Injection засечен - използвайте само букви и цифри!\n<br />\nIP: ".$_SERVER['REMOTE_ADDR']);
      }
      else
      {
        $check = preg_split("//", $value, -1, PREG_SPLIT_OFFSET_CAPTURE);
        foreach($check as $char)
        {
          if(in_array($char, $badchars))
          {
            die("SQL Injection засечен - използвайте само букви и цифри!\n<br />\nIP: ".$_SERVER['REMOTE_ADDR']);
          }
        }
      }
    }
  }
function clean_variable($var)
	{
	$newvar = preg_replace('/[^a-zA-Z0-9\_\-]/', '', $var);
	return $newvar;
	}

?>

После извикваш вункцията function check_inject(); където ти трябва...
 
@travata
не е мн правилен начин защото ако търси примерно някакъв запис с WHERE SELECT или темп подобни може би
$id = (int) $_GET['ne6u'];
if($id){
тука кода
}
може и else да го напсуваш че се опитва да хаква хах
амм начина на жоро е по добре но може и по простичко
(int) връща на 0 ако има букви и т.н.
пр
?ne6u=asd1231
ще върне на 0 и if() приема 0 като false също и ако е празно или не е зададено
но не е добре да се прави
die("опит за хак");
Примерно гоогъл бот индексира този файл без ?ne6u=ne6to
и какво да испише ако някой влезна :roll:
Успех
//off
ехх днеска ми е ден да нафлууда форума хах
//
 
Аз прекарвам всички $_GET и $_POST през тази функция:

Код:
function safe_get($string)
{

	$string = htmlspecialchars($string);
	$string = addslashes($string);
	
	return $string;
}
 
StormBreaker каза:
Аз прекарвам всички $_GET и $_POST през тази функция:

Код:
function safe_get($string)
{

	$string = htmlspecialchars($string);
	$string = addslashes($string);
	
	return $string;
}

htmlspecialchars($string); това какво прави?
 
StormBreaker ... назад си още с материала :) . Стремете се всички гетове ,които предавате да са целочислени числа ,като ги минавате да кажем през флоатвал .. или пък (инт) . А какво прави хтмлспециалчарс ... - взима таговете като обикновен текст.
 
morkov4o каза:
StormBreaker ... назад си още с материала :) . Стремете се всички гетове ,които предавате да са целочислени числа ,като ги минавате да кажем през флоатвал .. или пък (инт) . А какво прави хтмлспециалчарс ... - взима таговете като обикновен текст.

Аз гетвам стринг в моя случай а не някакво число
 
StormBreaker каза:
Аз прекарвам всички $_GET и $_POST през тази функция:

Код:
function safe_get($string)
{

	$string = htmlspecialchars($string);
	$string = addslashes($string);
	
	return $string;
}
А така! Ей това е ! Това те предпазва от HTML символи(включително и JS) и същота така от Инжекции във ДБ-то и PHP-то! :?: Също така трябва да внимаваш за скриптова за качване със Файлове! Там трябва да позволиш точно определените Разширетия които трябва и са позволени за качване! :?: Също за един хубав сайт трябва да има във полетата например за въвеждане на Пароли, Потребителски имена и темпподобни полета, максимум символи и Минимум символи! :?:
 
morkov4o каза:
StormBreaker ... назад си още с материала :) . Стремете се всички гетове ,които предавате да са целочислени числа ,като ги минавате да кажем през флоатвал .. или пък (инт) . А какво прави хтмлспециалчарс ... - взима таговете като обикновен текст.

Написал съм, че го ползвам и за постове и някой гетове. Ако гета ми е инт аз си го проверявам само дали е инт
 
Stanimir .. AddSlashes се ползва като вкарваш база данни. Пак казвам опитвайте се да предавате целочислени стойности.
 
Аз пък това правя
и после ако е за селект просто правя
mysql_query("SELECT ne6u,dru,treto FROM TABLE WHERE pole=\"".htmlspecialchars(stripslashes($_GET))."\"");
а пък за запис правя само htmlspecialchars
и нямам никакви проблеми
 
morkov4o каза:
Stanimir .. AddSlashes се ползва като вкарваш база данни. Пак казвам опитвайте се да предавате целочислени стойности.

Не е само за база данни. htmlspecialchars прави всички < и > в < и > и още някои неща преработваше.
 
Прочети какво съм писал :) ? Казвам за аддслашес ... и после ти ми говориш за хтмлспециалчарс ...
 

Back
Горе