Cet article partage principalement avec vous les attaques et solutions de sécurité PHP courantes. Comprendre les menaces de sécurité courantes des applications PHP peut garantir que votre application PHP ne soit pas attaquée. Par conséquent, cet article répertorie 6 attaques de sécurité PHP courantes. Tout le monde est invité à lire et à apprendre.
1. Injection SQL
L'injection SQL est une attaque malveillante dans laquelle les utilisateurs saisissent des instructions SQL dans les champs de formulaire pour affecter l'exécution normale de SQL. Il en existe également une injectée via la commande system() ou exec(), qui a le même mécanisme d'injection SQL, mais cible uniquement les commandes shell.
01 $username = $_POST['username'];02 $query = "select * from auth where username = '".$username."'";03 echo $query;04 $db = new mysqli('localhost', 'demo', ‘demo', ‘demodemo');05 $result = $db->query($query);06 if ($result && $result->num_rows) {07 echo "<br />Logged in successfully";08 } else {09 echo "<br />Login failed";10 }
Le code ci-dessus ne filtre ni n'échappe à la valeur saisie par l'utilisateur ($_POST['username']) sur la première ligne. Ainsi, la requête peut échouer, voire corrompre la base de données, selon que $username contient ou non la transformation de votre instruction SQL en autre chose.
Empêcher l'injection SQL
Options :
使用mysql_real_escape_string()过滤数据 手动检查每一数据是否为正确的数据类型 使用预处理语句并绑定变量
Utiliser les instructions préparées
分离数据和SQL逻辑 预处理语句将自动过滤(如:转义) 把它作为一个编码规范,可以帮助团队里的新人避免遇到以上问题
01 $query = 'select name, district from city where countrycode=?';02 if ($stmt = $db->prepare($query) )03 {04 $countrycode = 'hk';05 $stmt->bind_param("s", $countrycode); 06 $stmt->execute();07 $stmt->bind_result($name, $district);08 while ( $stmt ($stmt->fetch() ){09 echo $name.', '.$district;10 echo '<br />';11 }12 $stmt->close();13 }
2. 🎜>XSS (Cross-Site Scripting) est une attaque dans laquelle l'utilisateur saisit certaines données dans votre site Web, qui incluent un script côté client (généralement JavaScript). Si vous exportez des données vers une autre page Web sans filtrage, ce script sera exécuté.
Recevoir le contenu texte soumis par les utilisateurs
Que va-t-il se passer ?01 <?php02 if (file_exists('comments')) {03 $comments = get_saved_contents_from_file('comments');04 } else {05 $comments = '';06 }07 08 if (isset($_POST['comment'])) {09 $comments .= '<br />' . $_POST['comment'];10 save_contents_to_file('comments', $comments);11 }12 > 输出内容给(另一个)用户1 <form action='xss.php' method='POST'>2 Enter your comments here: <br />3 <textarea name='comment'></textarea> <br />4 <input type='submit' value='Post comment' />5 </form><hr /><br />6 7 <?php echo $comments; ?>
烦人的弹窗 刷新或重定向 损坏网页或表单 窃取cookie AJAX(XMLHttpRequest)
3. Fixation de session
Sécurité de session, en supposant qu'un PHPSESSID est difficile à deviner. Cependant, PHP peut accepter un identifiant de session via un cookie ou une URL. Par conséquent, l’usurpation d’identité d’une victime peut utiliser un identifiant de session spécifique (ou autre) ou une attaque de phishing.
4. Capture de session et détournement
C'est la même idée que la fixation de session, cependant, cela implique de voler l'ID de session. Si l'ID de session est stocké dans un cookie, il peut être volé par un attaquant via XSS et JavaScript. Si l'ID de session est inclus dans l'URL, il peut également être obtenu par reniflage ou à partir du serveur proxy.
Empêcher la capture et le détournement de session
5. Contrefaçon de requête intersite (CSRF)更新ID 如果使用会话,请确保用户使用SSL
Une attaque CSRF fait référence à une requête faite par une page qui ressemble à Soyez un utilisateur confiant du site, mais pas intentionnellement. Il existe de nombreuses variantes, comme cet exemple :
Prévenir la falsification de requêtes intersites1 ![](http://example.com/single_click_to_buy.php?user_id=123&item=12345)
En général, assurez-vous que l'utilisateur provient de votre formulaire et correspond à tous ceux que vous envoyez hors forme. Il y a deux points à retenir :
6. Injection de code对用户会话采用适当的安全措施,例如:给每一个会话更新id和用户使用SSL。 生成另一个一次性的令牌并将其嵌入表单,保存在会话中(一个会话变量),在提交时检查它。
L'injection de code est provoquée par l'exploitation de vulnérabilités informatiques en traitant des données invalides. Le problème survient lorsque vous exécutez accidentellement du code arbitraire, généralement via l'inclusion de fichiers. Un code mal écrit peut permettre à un fichier distant d'être inclus et exécuté. Comme beaucoup de fonctions PHP, comme require peut contenir une URL ou un nom de fichier, par exemple :
Dans l'exemple ci-dessus, en passant un nom de fichier ou une partie de nom de fichier saisi par l'utilisateur, il contient l'URL commençant par "http" Les fichiers commençant par ://".01 <form>Choose theme:02 <select name = theme>03 <option value = blue>Blue</option>04 <option value = green>Green</option>05 <option value = red>Red</option>06 </select>07 <input type = submit>08 </form>09 <?php10 if($theme) {11 require($theme.'.txt');12 }13 ?>
Empêcher l'injection de code
Autres principes généraux过滤用户输入 在php.ini中设置禁用allow_url_fopen和allow_url_include。这将禁用require/include/fopen的远程文件。
—par exemple, intégrez un PHP dans toutes les pages sensibles à la sécurité Fonction/fichier qui gère toutes les vérifications de connexion/logique de sécurité
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!