inyección php sql

1. ¿Qué es la inyección SQL?

En una aplicación, para interactuar con el usuario, el usuario puede enviar datos de entrada. Si la aplicación no procesa los datos de entrada del usuario, el atacante puede ingresar algunas cadenas relacionadas (generalmente con caracteres especiales) para permitir que la aplicación se ejecute sql语句. 危险的 SQL 操作, lo que da como resultado 泄漏datos confidenciales (como información del usuario) o 修改删除datos directamente en línea.

Insertar descripción de la imagen aquí

2. Procesamiento de inyección SQL

1. Utilice funciones integradas

Función uno: mysqli_real_escape_string

Función: 转义 En la cadena utilizada en sentencias SQL 特殊字符.

gramática:


mysqli_real_escape_string($connection, $escapestring);

选项参数:

	connection	必需。规定要使用的 MySQL 连接。
	
	escapestring	必需。要转义的字符串。编码的字符是 NUL(ASCII 0)、\n、\r、\、'、" 和 Control-Z。

Función 2: addcslashes() (utilizada principalmente para prevenir like语句la inyección)

Función: utilice barra invertida para escapar de caracteres en una cadena

gramática:


addcslashes($string, $characters)

选项参数:

	string	必需。规定要转义的字符串。
	
	characters	必需。规定要转义的字符或字符范围。

ejemplo:


//获取用户名
$username = $_GET['username']; 
//将特殊字符转义为普通字符
$username = addcslashes(mysqli_real_escape_string($conn, $username), "%_");
//执行sql语句操作
mysqli_query($conn, "SELECT FROM messages WHERE username LIKE '{
      
      $username}%'");

2. Utilice declaraciones preparadas por pdo

La declaración preparada por pdo procesará el valor vinculado al marcador de posición y también puede prevenir eficazmente ataques de inyección SQL.

función: PDO::prepare

gramática:


public PDO::prepare(string $query, array $options = []): PDOStatement|false

选项参数:

	query:必须是对目标数据库服务器有效的 SQL 语句模板。

	options:数组包含一个或多个 key=>value 键值对,为返回的 PDOStatement 对象设置属性。 常见用法是:设置 PDO::ATTR_CURSOR 为 PDO::CURSOR_SCROLL,将得到可滚动的光标。 某些驱动有驱动级的选项,在 prepare 时就设置。
	

ejemplo:


/* 传入数组的值,并执行已预处理的语句 */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
    
$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

$sth->execute(['calories' => 150, 'colour' => 'red']);
$red = $sth->fetchAll();

/* Array keys can be prefixed with colons ":" too (optional) */
$sth->execute([':calories' => 175, ':colour' => 'yellow']);

$yellow = $sth->fetchAll();

3. Precauciones de seguridad

  1. Nunca confíes en las aportaciones del usuario. Para verificar la entrada del usuario, puede utilizar expresiones regulares o limitar la longitud; convertir comillas simples y doble "-", etc.
  2. Nunca utilice el ensamblaje dinámico de SQL. Puede utilizar SQL parametrizado o utilizar directamente procedimientos almacenados para la consulta y el acceso a datos.
  3. Nunca utilice una conexión de base de datos con privilegios de administrador; utilice una conexión de base de datos separada con privilegios limitados para cada aplicación.
  4. No almacene información confidencial directamente. Cifre o haga hash de contraseñas e información confidencial.
  5. La información de excepción de la aplicación debe brindar la menor cantidad de sugerencias posible. Es mejor utilizar información de error personalizada para ajustar la información de error original.
  6. Los métodos de detección de inyección SQL generalmente utilizan software auxiliar o plataformas de sitios web para la detección. El software generalmente utiliza la herramienta de detección de inyección SQL jsky. La plataforma del sitio web incluye la herramienta de detección de plataforma de seguridad de sitios web Yisi, MDCSOFT SCAN, etc. El uso de MDCSOFT-IPS puede defenderse eficazmente contra la inyección SQL, ataques XSS, etc.

Supongo que te gusta

Origin blog.csdn.net/change_any_time/article/details/128698821
Recomendado
Clasificación