Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: SrTrp en 19 Febrero 2017, 01:19 am



Título: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: SrTrp en 19 Febrero 2017, 01:19 am
Bueno me acaban de hacer una SQL injection, y se logearon en mi cuenta de administrador, y decidi agregarle cifrado a mis contraseñas tambien captchas, que me recomiendan para hacer un bloqueo y evitar estos SQL INJECTIONS uso en mi login el metodo $_POST pero me dijieron que es mejor el metodo $_GET, si me pudiesen dar unos consejos para como poder bloquear las puertas mas faciles para evitar estos SQL injections.


Título: Re: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: engel lex en 19 Febrero 2017, 02:09 am
Citar
uso en mi login el metodo $_POST pero me dijieron que es mejor el metodo $_GET

quien te dijo eso consume drogas baratas... lo haces por get y todas las contraseñas quedarán guardadas como url en el historial...

para evitar sql inyection, se evita en lo posible cualquier pase de datos directos enter post y la DB

poe ejemplo para usuario

Código
  1. $user = $_POST["user"];
  2. $pass = $_POST["pass"];
  3. //aquí el usuario será convertido a una representación hexadecimal
  4. $variable_segura = bin2hex($user);
  5.  
  6. //se pasa como hexadecimal a la db y se pide que la compare quitando el hexadecimal y comparando en "binario"
  7. $sql = "SELECT pass FROM users WHERE name = UNHEX('$variable_segura')";
  8.  
  9. // ejecutar sql....
  10.  
  11. if(password_verify($pass, $resultado_sql)){
  12.  echo "usuario correcto";
  13. }else{
  14.  echo "usuario incorrecto";
  15. }
  16.  

hay más aproximaciones que usar hexadecimal, puedes usar prepared query, puedes usar base 64, puedes guardar los usuarios como hash... etc

claro para esto tuviste que guardar tus contraseñas en tu DB usando password_hash (http://php.net/manual/en/function.password-hash.php)

Código
  1. $hash = password_hash($contraseña_a_salvar, PASSWORD_DEFAULT);


Título: Re: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: SrTrp en 19 Febrero 2017, 02:32 am
Eso viene siendo para el loggearse verdad?
yo estoy usando la función htmlspecialchars para los caracteres pero igual se mejoraría  pasarlo a hexadecimal?
Código
  1. <?php
  2. function antiscript($DG) {
  3.  $DG= trim($DG);
  4.  $DG= stripslashes($DG);
  5.  $DG= htmlspecialchars($DG);
  6.  return $data;
  7. }
  8. include ("Encoding.php");
  9. require("conex.php");
  10.  
  11. $username= antiscript($_POST['usuario']);
  12. $pass= antiscript($_POST['pass']);
  13.  
  14. $sql=mysql_query("SELECT * FROM users WHERE usuario='$username'");
  15.  
  16. if($f=mysql_fetch_array($sql)){
  17.   $descript = Encrypter::decrypt($f['password']);
  18.  
  19. if($pass==$descript){
  20.    session_start();
  21.   $_SESSION['id']=$f['id'];
  22. $_SESSION['usuario']=$f['usuario'];
  23. ?>
  24.  
hay más aproximaciones que usar hexadecimal, puedes usar prepared query, puedes usar base 64, puedes guardar los usuarios como hash... etc

claro para esto tuviste que guardar tus contraseñas en tu DB usando password_hash (http://php.net/manual/en/function.password-hash.php)

Código
  1. $hash = password_hash($contraseña_a_salvar, PASSWORD_DEFAULT);

para cifrar las contraseñas las hago de esta manera, cual sería la mas a decuada la que me has mencionado o esta?

Código
  1. public static function encrypt ($SA) {
  2.        $EN= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(Encrypter::$Key), $SA, MCRYPT_MODE_CBC, md5(md5(Encrypter::$Key))));
  3.        return $EN;
  4.    }
  5.  

También me han recomendado implementar el $_SERVER para evitar los ataques XSS pero no se como implementarlo en mi formulario.
Código
  1. action="<?=$_SERVER['PHP_SELF'];?>">


· No hagas doble post, usa el botón modificar
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: engel lex en 19 Febrero 2017, 02:54 am
en general el metodo de cifrado está bien pero lo veo sobre elaborado... el que te dí es simple y directo, guarda un password normalmente en blowfish + salt

no uses mysql está ya obsoleto! si estnas al manual de php verás esto por todos lados

(http://i.imgur.com/eBBUrEu.png)


con el hex, no hay inyección que pase, ya que el contenido es convertido a una representación hexadecimal y luego su reconversión es comparada... para que pueda inyectarse, se necesita que al query llegue algún contenido interpretable por mysql, y en este caso, no lo hará


Título: Re: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: SrTrp en 19 Febrero 2017, 03:11 am
Ooo ya lo cambiare a mysqli en cuanto pueda  :(
Ya implemente lo de hexadecimal de los usuarios gracias  ;-)
En cuanto lo del
Código
  1. action="<?=$_SERVER['PHP_SELF'];?>">
como puedo integrarlo ya que quisiera también aprevenir para los XSS :P


Título: Re: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: engel lex en 19 Febrero 2017, 03:18 am
los xss es donde tengas cosas que los usuarios guarden en la base de datos y luego se muestre, o donde algún parametro get o post se muestre en el html... donde tienes algo de eso, no hay una solución universal a xss si no, fuera una función integrada a php y listo XD


Título: Re: Ayuda Consejos Para Evitar SQL INJECTION
Publicado por: SrTrp en 19 Febrero 2017, 03:20 am
los xss es donde tengas cosas que los usuarios guarden en la base de datos y luego se muestre, o donde algún parametro get o post se muestre en el html... donde tienes algo de eso, no hay una solución universal a xss si no, fuera una función integrada a php y listo XD
Ooo Gracias por la explicación y por la solución que me diste me ah servidor